2011-06-02 97 views
48

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

我很想在用户朋友使用应用程序时以及不再使用时通知用户。

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

+1

下面的应用程序(以某种方式)只要卸载它,即会在默认浏览器中打开一个新选项卡:https://play.google.com/store/apps/details?id = com.UCMobile.intl – caw 2015-02-01 23:00:47

+2

对于新的应用程序开发人员:请不要存储用户的电话号码。 [改用广告ID](http://android-developers.blogspot.com/2013/10/google-play-services-40.html)。 – 2016-01-21 00:11:52

+1

@DanDascalescu你有兴趣看看这里http://chat.stackoverflow.com/rooms/99906/android-canonicals?我可以做好反馈。 – 2016-01-21 02:53:30

回答

15

不幸的是ACTION_PACKAGE_REMOVED意图将被发送到除您自己以外的所有接收者。这已确认here

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

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

+2

应用程序'NQ Mobile Security'在卸载时调用一个活动,查看http://i.imgur.com/Fos9N.png,http://i.imgur.com/fIZbK.png,http ://i.imgur.com/cG9Hr.png和问题http://stackoverflow.com/questions/10219328/how-to-show-an-activity-before-my-app-is-uninstalled-android – 2012-06-16 09:50:07

+0

好的,最近有人在这方面低估了我。自从我5年前回答这个问题后它有所改变吗? – MattC 2016-02-01 17:49:18

+1

@MATC:我已经修复了Android网站上的文档。也许downvote是由于[其他答案](http://stackoverflow.com/questions/18692571/how-can-an-app-detect-that-its-going-to-be-uninstalled)提供一些解决方案? – 2016-02-04 18:23:26

3

我知道用身体“NotRegistered”消息服务器响应200只有一个办法。

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

7

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

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

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

44

的GCM文档解释这种情况在这里:

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

“它是从设备卸载后的应用程序可以自动取消注册。然而,这个过程不会发生向右走,因为Android不提供卸载回调。“

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

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

3

我有几点要告诉你,

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

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

2

看看这个GCM DOC: GCM Unregistration

你永远不应该注销您的应用程序。这从服务器端来看很重要。

7

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

相关问题