如果我的应用程序在后台运行(服务),我偶然发现了接收GCM消息的问题。在我的方案中,我没有收到GCM消息(请注意,这不是关于如何像here一样接收GCM),而ActivityManager会杀死应用程序。所以我想知道我是否有一个概念上的误解,或者它是否是一个普遍的问题。
背景
我有一个在前台(Activity)和后台(Service)中运行的Android应用程序。该应用程序附加到持久性通知,以确保即使用户打开Android TaskManager并将应用程序滑开,应用程序也会继续运行。该应用程序使用WakefulBroadcastReceiver和IntentService来接收和处理GCM消息(两者都在清单文件中注册,并且所有权限都已设置)。据我所知,这是Google处理GCM消息的建议模式。可以看到类似的解决方案here或here,但如果需要,我也可以添加代码示例。我知道Google使用API 3.1更改了Android BroadcastReceiver流程(例如here)。一般情况下,如果我的应用程序位于前台或只是在后台(活动仍然存在),我可以接收和处理GCM消息。
错误情景
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
有一些可用的信息,如果应用程序被强制退出(例如here或this),应用程序无法处理GCM消息,但这不是我的情况。我的应用程序在后台运行,只删除了活动。
出现错误情况时,我的应用程序没有可用的附加异常堆栈跟踪。我没有看到我没有收到GCM消息的原因,甚至没有看到应用程序被杀的原因。 如果我在附加到持久通知的服务中注册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):将消息推送到 过程:.................
是否有其他人遇到问题并找到了解决方案? :-)或者我的理解错了吗?
谢谢!
答案 0 :(得分:1)
使用新推荐的Google方式(使用GcmReceiver(com.google.android.gms.gcm.GcmReceiver)和GcmListenerService)仍会出现此问题。一般问题似乎与此bug相关。也许提到的解决方法对某人有用。