后台应用的GCM推送通知会导致崩溃

时间:2015-07-21 09:59:05

标签: android broadcastreceiver google-cloud-messaging intentservice

如果我的应用程序在后台运行(服务),我偶然发现了接收GCM消息的问题。在我的方案中,我没有收到GCM消息(请注意,这不是关于如何像here一样接收GCM),而ActivityManager会杀死应用程序。所以我想知道我是否有一个概念上的误解,或者它是否是一个普遍的问题。

背景

我有一个在前台(Activity)和后台(Service)中运行的Android应用程序。该应用程序附加到持久性通知,以确保即使用户打开Android TaskManager并将应用程序滑开,应用程序也会继续运行。该应用程序使用WakefulBroadcastReceiver和IntentService来接收和处理GCM消息(两者都在清单文件中注册,并且所有权限都已设置)。据我所知,这是Google处理GCM消息的建议模式。可以看到类似的解决方案herehere,但如果需要,我也可以添加代码示例。我知道Google使用API​​ 3.1更改了Android BroadcastReceiver流程(例如here)。一般情况下,如果我的应用程序位于前台或只是在后台(活动仍然存在),我可以接收和处理GCM消息。

错误情景

  1. 用户启动应用程序
  2. 用户打开Android任务管理器
  3. 用户从任务管理器中滑动/删除应用程序(注意:应用程序服务仍在后台运行。我的应用程序在后台运行的所有内容都能正常工作,并且应用程序的持久通知仍然可用)
  4. GCM推送通知将发送到设备/应用。
  5. 我的WakefulBroadcastReceiver没有获得推送通知。此外,在某些设备上,应用程序将死亡(持久性通知也将被删除)。在我的测试设备上,我注意到来自logcat的以下日志,而持久性通知仍然存在,但我的应用程序似乎不再运行(在logcat中没有应用程序的其他日志条目): 07-20 12:46:36.930: I/GCM(1071): GCM message foo.bar.blub 0:14373891986... 07-20 12:46:36.940: I/ActivityManager(750): Killing 23750:foo.bar.blub/... (adj 0): remove task 有一些可用的信息,如果应用程序被强制退出(例如herethis),应用程序无法处理GCM消息,但这不是我的情况。我的应用程序在后台运行,只删除了活动。 出现错误情况时,我的应用程序没有可用的附加异常堆栈跟踪。我没有看到我没有收到GCM消息的原因,甚至没有看到应用程序被杀的原因。
  6. 如果我在附加到持久通知的服务中注册WakefulBroadcastReceiver,则会发生同样的错误。

    其他信息

    Google宣布new way处理GCM消息,并鼓励用户进行更改。出于某些原因,我无法将短路切换到新方式。由于这个原因,我还没有验证新建议的方式。

    编辑: 切换到GcmReceiver时的其他日志信息

      

    08-06 18:33:01.670:I / GCM(3360):GCM留言foo.bar.blub   0:1438878778919403%9002042af9fd7ecd 08-06 18:33:01.695:   I / ActivityManager(815):杀死4296:foo.bar.blub / u0a216(adj 0):   删除任务... 08-06 18:33:01.909:W / BroadcastQueue(815):例外   发送广播时   ComponentInfo {foo.bar.blub / com.google.android.gms.gcm.GcmReceiver}   08-06 18:33:01.909:W / BroadcastQueue(815):   android.os.DeadObjectException 08-06 18:33:01.909:   W / BroadcastQueue(815):at   android.os.BinderProxy.transactNative(Native Method)08-06   18:33:01.909:W / BroadcastQueue(815):at   android.os.BinderProxy.transact(Binder.java:496)08-06 18:33:01.909:   W / BroadcastQueue(815):at   android.app.ApplicationThreadProxy.scheduleReceiver(ApplicationThreadNative.java:861)   08-06 18:33:01.909:W / BroadcastQueue(815):at   com.android.server.am.BroadcastQueue.processCurBroadcastLocked(BroadcastQueue.java:245)   08-06 18:33:01.909:W / BroadcastQueue(815):at   com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:898)   08-06 18:33:01.909:W / BroadcastQueue(815):at   com.android.server.am.BroadcastQueue $ BroadcastHandler.handleMessage(BroadcastQueue.java:149)   08-06 18:33:01.909:W / BroadcastQueue(815):at   android.os.Handler.dispatchMessage(Handler.java:102)08-06   18:33:01.909:W / BroadcastQueue(815):at   android.os.Looper.loop(Looper.java:135)08-06 18:33:01.909:   W / BroadcastQueue(815):at   android.os.HandlerThread.run(HandlerThread.java:61)08-06   18:33:01.909:W / BroadcastQueue(815):at   com.android.server.ServiceThread.run(ServiceThread.java:46)08-06   18:33:01.909:W / libprocessgroup(815):无法打开   /acct/uid_10216/pid_4296/cgroup.procs:没有这样的文件或目录08-06   18:33:01.910:W / ActivityManager(815):调度崩溃重启   服务foo.bar.blub / .service.BubbleService 1000ms 08-06   18:33:01.958:W / ActivityManager(815):虚假死亡   ProcessRecord {26174c48 4412:foo.bar.blub / u0a216},curProc for 4296:   null 08-06 18:33:03.253:W / ctxmgr(28358):[PowerConnectionState]得到了   与电源连接相同的值(插头状态:2 BatteryLevel:   0.66)08-06 18:33:08.277:W / ctxmgr(28358):[PowerConnectionState]与电源连接的值相同(插头状态:2 BatteryLevel:   0.66)

         

    08-06 18:33:01.909:W / libprocessgroup(815):无法打开   /acct/uid_10216/pid_4296/cgroup.procs:没有这样的文件或目录08-06   18:33:01.910:W / ActivityManager(815):调度崩溃重启   服务foo.bar.blub / .service.BubbleService 1000ms 08-06   18:33:01.957:​​I / art(4412):迟到-Xcheck:jni 08-06   18:33:01.958:I / ActivityManager(815):启动proc   4412:foo.bar.blub / u0a216进行广播   foo.bar.blub / com.google.android.gms.gcm.GcmReceiver 08-06   18:33:01.958:W / ActivityManager(815):虚假死亡   ProcessRecord {26174c48 4412:foo.bar.blub / u0a216},curProc for 4296:   null 08-06 18:33:01.992:I / art(4412):调试器不再处于活动状态   08-06 18:33:02.024:I / GcmDataIntentService(4412):将消息推送到   过程:.................

    是否有其他人遇到问题并找到了解决方案? :-)或者我的理解错了吗?

    谢谢!

1 个答案:

答案 0 :(得分:1)

使用新推荐的Google方式(使用GcmReceiver(com.google.android.gms.gcm.GcmReceiver)和GcmListenerService)仍会出现此问题。一般问题似乎与此bug相关。也许提到的解决方法对某人有用。