我的应用程序使用Google的C2DM(推送通知)来通知用户朋友的新活动。一旦他们安装了应用,我会向C2DM服务器注册设备并存储用户的电话号码。因此,我知道用户正在使用我的应用程序,并且可以发送推送通知给他/她。但是,如果用户卸载我的应用程序,有没有办法在我的应用程序中捕获它?还是唯一的方法是在发送C2DM时在我的服务器上捕获错误并将用户标记为非活动状态?
我希望能够在用户的好友开始或停止使用应用程序时通知他们。
这种情况下最好的解决方案是什么?
我的应用程序使用Google的C2DM(推送通知)来通知用户朋友的新活动。一旦他们安装了应用,我会向C2DM服务器注册设备并存储用户的电话号码。因此,我知道用户正在使用我的应用程序,并且可以发送推送通知给他/她。但是,如果用户卸载我的应用程序,有没有办法在我的应用程序中捕获它?还是唯一的方法是在发送C2DM时在我的服务器上捕获错误并将用户标记为非活动状态?
我希望能够在用户的好友开始或停止使用应用程序时通知他们。
这种情况下最好的解决方案是什么?
GCM文档在此解释了这种情况:
"应用程序在从设备中卸载后可能会自动取消注册。但是,Android不提供卸载回调,因此此过程不会立即发生。"
基本上当GCM尝试发送下一条推送通知时,设备将告诉GCM接收应用已被卸载。
至于通知朋友他们的朋友不再使用该应用程序,当此故障发生时,GCM会向您的通知服务器发送一个NotRegistered
错误;它不会是立即的,但你可以使用它吗?
很不幸,除了你自己以外,所有接收器都会收到ACTION_PACKAGE_REMOVED意图。这在这里得到确认。
针对您的C2DM计划有一些问题,因为我对它不是非常熟悉。如果用户长时间离线,那么是否会触发您使用的错误条件? C2DM如何报告“无法访问”的设备? 这是仅在尝试发送推送通知并失败时发生的情况,还是当它以某种方式确定已到达设备但未被正确处理时发生的情况? 显然,在第二种情况下,您的计划将起作用,但我可以看到其他情况可能会出现“误报”。
供参考的旧SO问题:android not receiving Intent ACTION_PACKAGE_REMOVED in the removed package
NQ移动安全
在卸载时调用一个活动,请查看http://i.imgur.com/Fos9N.png,http://i.imgur.com/fIZbK.png,http://i.imgur.com/cG9Hr.png以及问题https://dev59.com/JWkv5IYBdhLWcg3w91lG。 - Gaurav Agarwal是的,但这种方法有些hacky(不太正规)。 该方法基于一个事实:当卸载应用程序时,Android首先删除数据文件。因此,您可以使用文件监视器来检测删除操作。 此外,您需要使用本地代码编写此代码。如果您在Java中编写代码,则应用程序将在执行任何代码之前被卸载。 请参见此演示:https://github.com/sevenler/Uninstall_Statics
谷歌C2DM服务在检测卸载的应用程序时处于被动模式。
在不注销C2DM的情况下,卸载应用程序后第一次推送通知将不会返回任何错误响应。但是,第二次推送通知将返回“无效注册”或“未注册”的错误代码,您可以意识到应用程序已被卸载。
原因是C2DM服务器立即返回响应代码,然后尝试推送客户端。当客户端响应应用程序已被卸载时,它将从C2DM服务器中删除。下一次推送尝试将立即返回错误代码。
我有几点需要告诉你,
当您从服务器向GCM发送消息时,将收到响应字符串。如果您收到的错误是"NotRegistered",则应该从服务器数据库中删除注册ID,因为该应用已从设备中卸载或未配置广播接收器以接收com.google.android.c2dm.intent.RECEIVE意图。
我只知道一种服务器响应200的方式,即在响应内容中包含"NotRegistered"信息。
"NotRegistered"表示registration_id无效,例如用户已卸载了应用程序或关闭了通知。发送方应停止向该设备发送消息。