是否可以检测Android应用程序卸载?

j8yoct9x  于 2023-02-06  发布在  Android
关注(0)|答案(8)|浏览(226)

我的应用正在使用Google的C2 DM(推送通知),通知用户朋友的新活动。一旦他们安装了应用,我会在C2 DM服务器上注册设备并存储用户的电话号码。这样我就知道用户正在使用我的应用,我可以向他/她发送推送通知。但如果用户卸载我的应用,是否有办法在我的应用中捕捉到它?或者唯一的办法是在我发送C2 DM时在服务器上捕捉到错误,然后将用户标记为非活动?
我很乐意在用户的朋友使用应用程序时和他们不再使用时通知用户。
此情形的最佳解决方案是什么?

wz1wpwve

wz1wpwve1#

GCM文档在此解释了这种情况:
https://developers.google.com/cloud-messaging/registration#how-uninstalled-client-app-unregistration-works
应用程序从设备中卸载后可以自动取消注册。但是,此过程不会立即发生,因为Android不提供卸载回调。
基本上,当GCM尝试发送下一个推送通知时,设备将告诉GCM接收应用程序已卸载。
至于通知朋友他们的朋友不再使用应用程序,GCM将发送一个NotRegistered错误到您的通知服务器时,这个故障发生;不会马上,但你能用那个吗?

llycmphe

llycmphe2#

很遗憾,ACTION_PACKAGE_REMOVED Intent将发送给除您自己之外的所有接收者。
关于您的C2DM计划的一些问题,因为我对它不是很熟悉。如果用户只是让他们的设备关闭很长一段时间,这会触发你使用的错误条件吗?C2DM实际上是如何报告一个“无法到达”的设备的?这种情况是仅在尝试发送推送通知但失败时发生,还是在以某种方式确定它到达设备但未能到达时发生处理得当?显然在第二种情况下你的计划会奏效,但我可以看到一些“假阳性”发生在其他情况下。
供参考的旧SO问题:android not receiving Intent ACTION_PACKAGE_REMOVED in the removed package

fjaof16o

fjaof16o3#

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

k75qkfdt

k75qkfdt4#

Google C2 DM服务在检测未安装的应用程序时处于被动模式。
卸载应用程序后的第一个推送通知(没有从C2 DM中注销!!!)不会返回任何错误响应。但是,第二个推送通知将返回“无效注册”或“未注册”错误代码,您可以意识到应用程序已卸载。
原因是C2 DM服务器立即返回响应代码,然后才尝试推送客户端。当客户端响应应用程序已卸载时,它将从C2 DM服务器中删除。下一次推送尝试将立即返回错误代码。

q0qdq0h2

q0qdq0h25#

我有几点要告诉你,

  1. Android社区建议您使用GCM而不是C2DM,因为它不再可用。
    1.在android中,应用程序无法获得应用程序正在被卸载的通知。
    1.在GCM中,如果您想停止向未安装的应用程序发送消息,可以参考
    当您从服务器向GCM发送消息时,您将收到响应字符串。如果您收到错误“NotRegistered,您应该从服务器数据库中删除注册ID,因为该应用程序已从设备中卸载,或者它没有配置广播接收器来接收com.google.android.c2dm.intent.RECEIVE意图。”
brgchamk

brgchamk6#

我只知道一种方法,即服务器响应200的正文中包含“NotRegistered”消息。
NotRegistered -registration_id不再有效,例如,用户已卸载应用程序或关闭通知。发件人应停止向此设备发送消息。

wdebmtf2

wdebmtf27#

查看此GCM文档:GCM注销
你不应该注销你的应用程序。这是从服务器端照顾。

4jb9z9bj

4jb9z9bj8#

要使用Google Play服务检测应用卸载,你可以使用应用卸载报告API。此API允许你在用户卸载应用时接收通知。@ThanksChatGPT

相关问题