Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以检测到Android应用程序卸载?_Android_Uninstallation_Detect_Android C2dm - Fatal编程技术网

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

是否可以检测到Android应用程序卸载?,android,uninstallation,detect,android-c2dm,Android,Uninstallation,Detect,Android C2dm,我的应用程序使用谷歌的C2DM(推送通知)通知用户朋友的新活动。一旦他们安装了应用程序,我就向C2DM服务器注册设备,并存储用户的电话号码。因此,我知道用户正在使用我的应用程序,我可以向他/她发送推送通知。但是,如果用户卸载我的应用程序会发生什么情况,有没有办法在我的应用程序中捕获它?或者,唯一的方法是在我发送C2DM且无法访问时捕获服务器上的错误,然后将用户标记为非活动用户 当他们的朋友正在使用某个应用程序时,或者当他们不再使用某个应用程序时,我很乐意通知用户 对于这种情况,最好的解决方案是什

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

当他们的朋友正在使用某个应用程序时,或者当他们不再使用某个应用程序时,我很乐意通知用户


对于这种情况,最好的解决方案是什么?

不幸的是,除您自己的接收者外,删除的操作包将发送给所有接收者。这已得到证实

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


旧的SO问题供参考:

我只知道一种方法,服务器响应200的正文中有“NotRegistered”消息


NotRegistered-注册id不再有效,例如用户已卸载应用程序或关闭通知。发件人应停止向该设备发送消息。

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

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


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

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

应用程序从设备卸载后可以自动注销。但是,此过程不会立即进行,因为Android不提供卸载回调

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


至于通知朋友他们的朋友不再使用该应用程序,当发生此故障时,GCM将向您的通知服务器发送
notregisted
错误;不会很快,但你能用这个吗?

我有几点要告诉你

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

    查看此GCM文档:


    你永远不应该注销你的应用程序。这是由服务器端处理的。

    是的,但它相当黑客。 该方法基于这样一个事实:android卸载你的应用程序时做的第一件事就是删除你的数据文件。因此,你可以使用文件监视程序来检测删除情况。 你还需要用本机代码编写。如果你用java编写代码,你的应用程序将在执行任何代码之前被卸载。
    请看这个演示:

    应用程序
    NQ Mobile Security
    正在调用卸载时的一个活动看看,这个问题好吧,最近有人在这个问题上否决了我。自从我5年前回答这个问题以来,它有变吗?@MattC:我已经修复了安卓网站上的文档。也许否决是因为提供了一些解决方案?如果不是p那么Firebase Analytics是如何提供应用程序_自动删除事件的呢?@OfekRon我在5年前写了这个答案。它偶尔会出现在我和我自己的软件包中,但并不总是如此。也许现在它总是在卸载你的应用程序之前交付。下面的应用程序(不知何故)卸载后立即在默认浏览器中打开一个新选项卡:对于新的应用程序开发人员:请不要存储用户的电话号码。@MsYvette:此问题是的重复,它有更好的答案。该问题应该是规范的。