20

我在我的 Android 项目中使用推送通知 (GCM)。

根据 GCM 教程,我实现了广播接收器并将其注册到AndroidManifest.xml.

即使我的应用程序关闭,这种广播接收器也应该接收消息(不仅当我的应用程序在后台,而且即使它被强制停止)。

但它不像我预期的那样工作。onReceive()如果应用程序关闭,则不会调用方法。看来我对广播接收器的理解是正确的,问题在于我对 GCM 的期望。

可能的原因之一是如果应用程序关闭,谷歌服务器甚至不会向设备发送通知。那么,仅当我的应用程序onReceive()正在运行或在后台(但未关闭)时,我的应用程序才能接收消息(并且将在广播接收器中调用方法)是否正确?

提前致谢。

4

3 回答 3

16

即使我的应用程序关闭,这种广播接收器也应该接收消息(不仅当我的应用程序在后台,而且即使它被强制停止)。

如果用户从设置中强制停止您的应用程序,您的代码将永远不会再次运行,直到手动运行您的组件之一,通常是用户手动启动活动(从 Android 3.1 开始)。因此,如果用户从设置中强制停止您的应用程序,您将不会在较新的设备/模拟器上收到 GCM 消息。

那么,仅当我的应用程序正在运行或在后台(但未关闭)时,我的应用程序才能接收消息(并且将在广播接收器中调用 onReceive() 方法)是否正确?

从应用程序的角度来看,Android 中没有“关闭”的概念。如果“关闭”的意思是“没有正在运行的进程,最后一个进程正常终止”,那么是的,你应该收到 GCM 消息和其他广播。但是,同样,强制停止不是“正常终止”。

于 2012-08-22T12:57:26.400 回答
3

根据 Francesco Nerieri 在这个 android-gcm 线程中的说法:

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

于 2012-08-27T21:16:23.457 回答
2

文档中它说:

无需运行 Android 设备上的 Android 应用程序即可接收消息。系统会在消息到达时通过 Intent 广播唤醒 Android 应用程序,只要应用程序设置了正确的广播接收器和权限。

检查您的广播接收器实现和权限。

于 2012-08-22T12:49:16.500 回答