是否有可能检测到Android应用程序卸载?

我的应用程序使用Google的C2DM(推送通知)通知用户有关朋友的新活动。 一旦他们安装应用程序,我用C2DM服务器注册设备并存储用户的电话号码。 所以我知道用户正在使用我的应用程序,我可以发送他/她的推送通知。 但是,如果用户卸载我的应用程序会发生什么,有没有办法在我的应用程序中捕捉它? 或者唯一的办法就是当我发送一个C2DM并且无法访问时,在我的服务器上发现一个错误,然后将用户标记为不活动?

我很想告诉用户,当他们的朋友正在使用一个应用程序,当他们不再这样做。

什么是这种情况下的最佳解决scheme?

不幸的是,ACTION_PACKAGE_REMOVED意图将被发送到除您自己以外的所有接收者。 这在这里得到证实。

因为我不是很熟悉C2DM计划的一些问题。 如果用户长时间closures设备,是否会触发您使用的错误条件? C2DM如何报告“无法访问”的设备? 这是一个条件,只有当它试图发送推送通知失败,或者当它以某种方式确定它到达设备但未能正确处理? 很明显,在第二种情况下,你的计划是可行的,但是我可以看到一些“误报”。

较老的SO的问题,以供参考: 在移除的包中,android没有收到Intent ACTION_PACKAGE_REMOVED

GCM文档解释了这种情况:

https://developers.google.com/cloud-messaging/registration#how-uninstalled-client-app-unregistration-works

“应用程序可以从设备上卸载后自动取消注册,但是这个过程不会立即发生,因为Android不提供卸载callback。

基本上,当GCM尝试发送下一个推送通知时,设备将告诉GCM接收的应用程序已被卸载。

至于通知朋友他们的朋友不再使用该应用程序,GCM将在发生此故障时向您的通知服务器发送NotRegistered错误; 它不会立即,但你可以使用它?

当涉及到检测到卸载的应用程序时,Google C2DM服务处于被动模式。

卸载应用程序后(不从C2DM注销)首先推送通知将不会返回任何错误的回应。 但是,第二次推送通知将返回一个“无效注册”或“未注册”错误代码,您可以在其中意识到应用程序已被卸载。

原因是C2DM服务器立即返回响应代码,然后才试图推送客户端。 当客户端响应应用程序被卸载时,将从C2DM服务器中删除。 下一步尝试将立即返回错误代码。

是的,但相当不好。 该方法是基于这样的事实,即android在卸载应用程序时所做的第一件事是删除您的数据文件。 所以你可以使用文件观察器来检测删除。 你也需要用本地代码写这个。 如果你用java编写你的代码,你的应用程序将被卸载,然后它可以执行任何代码。 请看这个演示: https : //github.com/sevenler/Uninstall_Statics

我知道只有一个方法与服务器响应200与正文“NotRegistered”消息。

NotRegistered – registration_id不再有效,例如用户卸载了应用程序或closures了通知。 发件人应该停止发送消息到这个设备。

我有几点要告诉你,

  1. Android社区build议您使用GCM而不是C2DM,因为它不再可用。
  2. 在android中,应用程序无法通知应用程序正在卸载。
  3. 在GCM中,如果你想停止发送消息到卸载的应用程序,你可以参考这个

当你从服务器发送消息到GCM时,你会得到响应string。如果你的错误是“NotRegistered”,你应该从服务器数据库中删除注册ID,因为应用程序是从设备上卸载的,或者它没有广播接收器configuration为接收com.google.android.c2dm.intent.RECEIVE意图。“

看看这个GCM文档: GCM注销

你永远不应该注销你的应用程序。 这是从服务器端照顾。