应用程序停止时如何接收来自 GCM 的通知

Posted

技术标签:

【中文标题】应用程序停止时如何接收来自 GCM 的通知【英文标题】:How can I receive notifications from GCM when application is stopped 【发布时间】:2012-07-23 14:26:41 【问题描述】:

如果应用程序未运行,GCMIntentService(扩展 GCMBaseIntentService)不会收到通知。

发件人:http://developer.android.com/about/versions/android-3.1.html

在已停止的应用程序上启动控件 请注意,系统会将 FLAG_EXCLUDE_STOPPED_PACKAGES 添加到所有广播意图中。这样做是为了防止来自后台服务的广播无意或不必要地启动已停止应用程序的组件。后台服务或应用程序可以通过将 FLAG_INCLUDE_STOPPED_PACKAGES 标志添加到应允许激活停止的应用程序的广播意图来覆盖此行为。

有没有办法绕过这个设置? 谢谢

【问题讨论】:

【参考方案1】:

如果应用程序未运行,GCMIntentService(扩展 GCMBaseIntentService)不会收到通知。

是的,它会的。不过,您的问题的其余部分与应用程序是否正在运行 无关,而是与用户之前是否运行过它有关。您引用的段落中的“停止”一词的含义不是“未运行”,而是表示应用程序所处的状态:

首次安装时,在手动调用组件之前(例如,用户启动活动)

在用户强制停止应用程序后,直到手动调用某个组件(例如,用户启动一个活动)

(我真的很希望他们为此想出一个比“停止”更独特的形容词......)

有没有办法绕过这个设置?

没有。如果用户强制停止您的应用程序,他们表示他们不希望您的应用程序出于任何原因再次运行,直到他们再次手动启动它。您的目标是让用户没有理由强制停止您的应用程序。请注意,我的意思是“强制停止”(即,从“设置”中按下“强制停止”按钮)——普通的任务管理器,或者从 Android 4.x 中的“最近任务”列表中滑动,没有这种效果。

【讨论】:

“普通”任务管理器是指没有 root 访问权限的任务管理器吗? @Mopper:我所说的“普通”任务管理器是指用户从 Play 商店下载的那些。 AFAIK,root 访问权限不会改变他们的行为。 根据我的经验,如果用户滑动以从“最近的任务”中删除该应用程序,那么这也会阻止该服务接收消息。对我来说,只有当我的应用程序从应用程序本身进入后台或手动关闭时,我才会收到 GCM 消息。 @Bryan:只有在您使用他们修改了最近任务列表行为的设备上时,才会出现这种情况。比如我刚刚在运行Android 4.3的Galaxy Nexus上运行github.com/commonsguy/cw-omnibus/tree/master/Push/GCMClient2,成功推送到它,刷了它最近的任务列表,又成功推送到它。 我可能应该注意到我正在使用github.com/Redth/PushSharp 推送到 android 设备的单声道。该服务存在一个已知问题,它可能是 monodroid,但在 Xperia S 或 Nexus 7 上运行并且从“最近的任务”中删除该应用程序会阻止接收推送通知。【参考方案2】:

据 this android-gcm thread 中的 Francesco Nerieri 所说:

因此,如果您强制停止应用程序,ICS 的预期行为是针对 应用程序不接收消息。在 JB 中,这意味着 GCM 也将 注销应用程序,这是一种不幸的行为,我们是 努力改变这一点(JB 中的注销部分)。

【讨论】:

以上是关于应用程序停止时如何接收来自 GCM 的通知的主要内容,如果未能解决你的问题,请参考以下文章

使 GCM 通知在应用程序中可配置

Android - GCM 在打开应用程序时收到来自 gcm 的通知

仅接收来自 GCM 的最后一个后台静默推送通知

关闭应用程序时如何避免处理来自 GCM 的推送通知

GCM 推送通知仅适用于调试 apk

当应用程序关闭时,GCM 广播接收器未检测到 gcm 通知