能否检测到Android应用程序的卸载?

68

我的应用程序使用Google的C2DM(推送通知)来通知用户朋友的新活动。一旦他们安装了应用,我会向C2DM服务器注册设备并存储用户的电话号码。因此,我知道用户正在使用我的应用程序,并且可以发送推送通知给他/她。但是,如果用户卸载我的应用程序,有没有办法在我的应用程序中捕获它?还是唯一的方法是在发送C2DM时在我的服务器上捕获错误并将用户标记为非活动状态?

我希望能够在用户的好友开始或停止使用应用程序时通知他们。

这种情况下最好的解决方案是什么?


1
以下应用程序在卸载后会立即在默认浏览器中打开一个新标签页:https://play.google.com/store/apps/details?id=com.UCMobile.intl - caw
2
对于新的应用程序开发者:请不要存储用户的电话号码。使用广告 ID 代替 - Dan Dascalescu
2
@MsYvette:这个问题是如何检测应用程序即将被卸载的重复,那个问题有更好的答案。那个应该成为规范。 - Dan Dascalescu
8个回答

50

GCM文档在此解释了这种情况:

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

"应用程序在从设备中卸载后可能会自动取消注册。但是,Android不提供卸载回调,因此此过程不会立即发生。"

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

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


27

很不幸,除了你自己以外,所有接收器都会收到ACTION_PACKAGE_REMOVED意图。这在这里得到确认。

针对您的C2DM计划有一些问题,因为我对它不是非常熟悉。如果用户长时间离线,那么是否会触发您使用的错误条件? C2DM如何报告“无法访问”的设备? 这是仅在尝试发送推送通知并失败时发生的情况,还是当它以某种方式确定已到达设备但未被正确处理时发生的情况? 显然,在第二种情况下,您的计划将起作用,但我可以看到其他情况可能会出现“误报”。

供参考的旧SO问题:android not receiving Intent ACTION_PACKAGE_REMOVED in the removed package


2
应用程序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
好的,最近有人在我的回答上给我点了踩。自从我五年前回答这个问题以来,情况有变化吗? - MattC
1
@MattC:我已经修复了Android网站上的文档。也许downvote是因为其他答案提供了一些解决方案? - Dan Dascalescu
如果不可能的话,那Firebase Analytics如何自动提供app_remove事件呢? - Ofek Ron
@OfekRon 我写了这个答案5年前。它偶尔会出现在我的自己的包中,但并不总是。也许现在它总是在你的应用程序卸载之前被传递。 - MattC
@OfekRon,我发布的文档仍然指出:“正在被删除的包不会接收此Intent。”因此除了注册特定的广播意图之外,必须有其他方法。 - MattC

8

是的,但这种方法有些hacky(不太正规)。 该方法基于一个事实:当卸载应用程序时,Android首先删除数据文件。因此,您可以使用文件监视器来检测删除操作。 此外,您需要使用本地代码编写此代码。如果您在Java中编写代码,则应用程序将在执行任何代码之前被卸载。 请参见此演示:https://github.com/sevenler/Uninstall_Statics


7

谷歌C2DM服务在检测卸载的应用程序时处于被动模式。

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

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


5

我有几点需要告诉你,

  1. Android社区建议您使用GCM而不是C2DM,因为C2DM已不再可用。
  2. 在Android中,应用程序无法获得通知其正在被卸载的方式。
  3. 如果想要在GCM中停止向已卸载的应用发送消息,您可以参考以下内容:

当您从服务器向GCM发送消息时,将收到响应字符串。如果您收到的错误是"NotRegistered",则应该从服务器数据库中删除注册ID,因为该应用已从设备中卸载或未配置广播接收器以接收com.google.android.c2dm.intent.RECEIVE意图。


3

我只知道一种服务器响应200的方式,即在响应内容中包含"NotRegistered"信息。

"NotRegistered"表示registration_id无效,例如用户已卸载了应用程序或关闭了通知。发送方应停止向该设备发送消息。


2

请查看这份GCM文档:GCM注销

您不应该注销您的应用程序,这是由服务器端处理的。


-1
使用Google Play服务检测应用程序卸载,您可以使用App卸载报告API。该API允许您在用户卸载您的应用程序时接收通知。 @ThanksChatGPT

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接