我在Android项目中使用推送通知(GCM)。
根据GCM教程,我实现了广播接收器并在AndroidManifest.xml
中注册了它。
即使我的应用程序已关闭,这种广播接收器也应该接收消息(不仅是我的应用程序处于后台,但即使它被强制停止)。
但它没有像我期望的那样起作用。如果应用关闭,则不会调用onReceive()
方法。我对广播接收机的理解似乎是正确的,问题在于我对GCM的期望。
可能的原因之一是,如果应用关闭,Google服务器甚至不会向设备发送通知。那么,我的应用程序是否可以接收消息(并且onReceive()
方法将在广播接收器中调用),只有当它正在运行或在后台(但未关闭)时才是正确的吗?
提前致谢。
答案 0 :(得分:16)
即使我的应用程序已关闭,这种广播接收器也应该接收消息(不仅是我的应用程序处于后台,但即使它被强制停止)。
如果用户强行停止您的应用设置,您的代码永远不会再次运行,直到手动运行您的某个组件,通常是用户手动启动活动(从Android 3.1开始) )。因此,如果用户强制停止您的应用程序设置,您将不会在较新的设备/模拟器上收到GCM消息。
那么,只有当我的应用程序正在运行或在后台运行(但未关闭)时,我的应用程序才能接收到一条消息(并且广播接收器中将调用onReceive()方法)是否正确?
从应用程序的角度来看,Android中没有“封闭”的概念。如果,通过“关闭”,你的意思是“没有正在运行的进程,最后一个进程正常终止”,那么是的,你应该收到GCM消息和其他广播。但是,再次强制停止并非“正常终止”。
答案 1 :(得分:3)
Francesco Nerieri在this android-gcm thread中说:
因此,如果您强制停止应用程序,则ICS的预期行为适用于 应用程序不接收消息。在JB中,这意味着GCM也将 取消注册应用程序,这是一个不幸的行为,我们是 努力改变这一点(JB中的取消注册部分)。
答案 2 :(得分:2)
在documentation中它说:
Android设备上的Android应用程序无需运行 接收消息。系统将唤醒Android应用程序 当消息到达时通过Intent广播,只要 应用程序设置适当的广播接收器和 权限。
检查您的广播接收器实施和权限。