当应用程序停止运行时,我该如何从GCM接收通知?

10

GCMIntentService(继承自GCMBaseIntentService)如果应用程序未运行,则无法接收通知。

来自:http://developer.android.com/about/versions/android-3.1.html

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

有没有办法解决这个设置的限制? 谢谢

2个回答

22
如果应用程序没有运行,GCMIntentService(扩展GCMBaseIntentService)将无法接收通知。
是的,它会。但你所问的问题并不完全与应用程序是否“运行”有关,而是与用户之前是否运行过该应用程序有关。在您引用的段落中,“停止”一词的含义不是“未运行”,而表示应用程序所处的状态:
当它第一次安装时,在某些手动调用组件之前(例如,用户启动了一个Activity);
用户强制停止应用程序后,在某些手动调用组件之前(例如,用户启动了一个Activity)。
(我真的非常希望他们能想出一个更具特色的形容词来描述这个状态……)
有没有办法绕过这个设置?
没有。如果用户强制停止您的应用程序,则表示他们不希望您的应用程序再次运行,无论什么原因,直到他们手动再次启动它。您的目标是让用户没有理由强制停止您的应用程序。请注意,我指的是“强制停止”(即,从设置中按下“强制停止”按钮),普通的任务管理器或在Android 4.x中从“最近使用的任务”列表中滑动不会产生这种效果。

5
根据我的经验,如果用户在“最近任务”中滑动删除应用程序,那么这也会阻止服务接收到消息。只有当我的应用程序处于后台或被手动从应用程序本身关闭时,我才能接收到 GCM 消息。请注意,不要改变原文的意思。 - Bryan
1
@Bryan:只有在某些设备上修改了最近任务列表的行为,这才是正确的。例如,我刚在运行Android 4.3的Galaxy Nexus上运行了https://github.com/commonsguy/cw-omnibus/tree/master/Push/GCMClient2,在它上面成功地进行推送,将其从最近任务列表中滑动掉后,仍然能够成功地进行推送。 - CommonsWare
我可能应该注明我正在使用 https://github.com/Redth/PushSharp 来推送到一个 Mono for Android 设备。这个服务已知存在问题,可能是因为它是 monodroid,但在 Xperia S 或 Nexus 7 上运行并从最近任务中删除该应用程序可以防止接收推送通知。 - Bryan
@CommonsWare,能否告诉我推特是如何运作的呢?因为我的手机上没有为推特运行的服务,也没有在后台或最近任务列表中运行。但是我仍然可以接收到来自推特的GCM调用,而其他应用程序则不能,这是为什么呢? - UMESH0492
@CommonsWare 我关闭了应用程序。发送了一些通知。再次启动应用程序,但是那些通知永远丢失了。有没有办法将这些通知排队或在我再次启动应用程序时获取这些通知? - shijin
显示剩余4条评论

2
根据 Francesco Nerieri 在 this android-gcm thread 中的说法:

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


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