Android GCM(推送通知):如果应用程序停止,设备将无法接收通知

20

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

根据 GCM 教程,我实现了广播接收器并在 AndroidManifest.xml 中进行了注册。

这种类型的广播接收器应该可以在我的应用程序关闭时接收到消息(不仅在我的应用程序在后台运行时,即使被强制停止也应该能够接收到消息)。

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

可能的一个原因是,如果应用程序已关闭,Google 服务器甚至不会将通知发送到设备。所以,我的应用程序只有在运行或在后台运行时才能接收到消息(但不能在关闭时接收到消息),这是正确的吗?

提前致谢。


2
我有同样的问题,但是我没有得到答案。你解决了吗? - Mahdi
1
如果您想模拟应用程序在设备上正常关闭(类似的情况),请在开发人员选项下选择“不保留活动”。然后,每当您的一个活动进入后台时,它将被关闭。但是您的广播接收器将继续运行。 - Fraser
@Fraser 你说得没错,但是应用程序的停止状态和Activity的停止状态并不相同。系统会分别管理这两种停止状态(http://developer.android.com/about/versions/android-3.1.html#launchcontrols)。 - John
3个回答

16

这种广播接收器应该在我的应用关闭后(不仅是在应用在后台时,即使被强制停止也应该能接收信息)接收到消息。

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

那么,我的应用只有在运行或在后台(但未关闭)时才能接收到消息(并且broadcast receiver中的onReceive()方法将被调用),这是正确的吗?

从应用程序的角度来看,在Android中不存在“关闭”的概念。如果您所说的“关闭”是指“没有运行的进程,最后一个进程正常终止”,那么是的,您应该接收到GCM消息和其他广播。但是,再次强调,force-stop不是“正常终止”。


1
我刚刚使用airbop-client进行了测试,可以确认在应用程序被强制停止后,onReceive()方法没有被调用。我看到一个标记为GTalkService的c2dm.intent.RECEIVE的logcat条目,显示结果为CANCELLED。 - Lorne Laliberte
1
@CommonsWare 不是。我是从桌面发送电子邮件的。而且我确定 Gmail 应用程序没有在运行。因为强制停止按钮在我按一次后就被禁用了。所以没有进程在运行。 - Seshu Vinay
1
为了确保,我再次进行了测试。强制停止 Gmail 应用程序,从桌面发送电子邮件,并收到通知。顺便说一下,我在 Nexus 7(2012)设备上测试了这个。Gmail 版本:5.0.1(1642443)。 - Seshu Vinay
1
收件箱应用程序也发生了同样的情况。我不知道是否有什么遗漏。 - Seshu Vinay
1
@SeshuVinay,我也遇到了同样的问题,只是好奇你是否得到了答案。WhatsApp也是同样的情况。 - D V Ramana
显示剩余6条评论

3
根据Francesco Nerieri在此android-gcm线程中的说法:
如果强制停止应用程序,则ICS的预期行为是应用程序不接收消息。 在JB中,这意味着GCM也将注销应用程序,这是一种不幸的行为,我们正在努力改变这一点(在JB中取消注册部分)。

自从那时以来,他们似乎已经解决了这个问题。我测试了向一个强制关闭的应用程序发送推送通知,GCM 响应为 '"success":1,"failure":0'。当该应用程序被卸载后,响应会提示 registrationId 已过时并应该从你的应用服务器中注销。 - John
@John:成功:1 表示推送已经成功发送到您的设备。如果您将设备连接到 Android Studio 并检查 Android Monitor,则会看到类似以下内容的信息:W/GCM:broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000000 }。 - jee

2
文档中提到:

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

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


3
文件只写了“唤醒”,这对我来说意味着一个应用程序正在“休眠”或在后台运行。但是,当你强制关闭一个应用程序时,它没有任何正在运行的进程可以“唤醒”,它需要被启动。 - Pete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接