【问题标题】:Android GCM (push notification): device doesn't receive notification if application is stoppedAndroid GCM(推送通知):如果应用程序停止,设备不会收到通知
【发布时间】:2012-08-17 21:29:58
【问题描述】:

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

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

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

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

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

提前致谢。

【问题讨论】:

  • 我有同样的问题,但我没有得到答案。你解决了吗?
  • 如果你想模拟你的应用程序正常关闭(有点),在你的设备上,在开发者选项下,选择“不保留活动”。然后,每当您的一项活动进入后台时,它将被关闭。但是您的广播接收器将继续运行
  • @Fraser 你是对的,但应用程序的停止状态与活动的停止状态不同。系统分别管理这两个停止状态 (developer.android.com/about/versions/…)。

标签: android broadcastreceiver push-notification google-cloud-messaging


【解决方案1】:

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

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

【讨论】:

  • 他们似乎已经解决了。我测试了向强制关闭应用发送推送,GCM 响应“成功”:1,“失败”:0。当应用程序被卸载时,它会回复registrationId已过时并且应该取消注册(从您的应用程序服务器)。
  • @John: Sucess: 1 表示推送已发送到您的设备。如果您将您的设备连接到 android studio,并检查 Android 监视器,您将看到如下内容: W/GCM:广播意图回调:result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000000
【解决方案2】:

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

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

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

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

【讨论】:

  • 我刚刚使用airbop-client 对此进行了测试,我可以确认在应用程序被强制停止后未调用 onReceive() 方法。我看到带有 GTalkService 标记的 c2dm.intent.RECEIVE 的 logcat 条目显示 result=CANCELLED。
  • @CommonsWare 不,我从桌面发送电子邮件。而且我确信 gmail 应用程序没有运行。因为强制停止按钮在我按下一次后被禁用。所以没有进程在运行。
  • 只是为了确保,我又这样做了。强制停止 Gmail 应用程序,从桌面发送电子邮件,并收到通知。顺便说一句,我在 Nexus 7(2012) 设备中对此进行了测试。 Gmail 版本:5.0.1(1642443)
  • 收件箱应用程序也是如此。我不知道我是否遗漏了什么。
  • @SeshuVinay 我也面临同样的问题,我只是好奇你是否得到答案。watsapp 也是如此。
【解决方案3】:

documentation 中说:

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

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

【讨论】:

  • 文档只说“唤醒”,这对我来说意味着应用程序正在“睡眠”或在后台。但是当你强制关闭一个应用程序时,它没有正在运行的进程“唤醒”,它需要被启动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 2015-02-09
相关资源
最近更新 更多