当前位置: 首页 > 知识库问答 >
问题:

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

邵星河
2023-03-14

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

出身背景

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

错误场景

  1. 用户启动应用程序。
  2. 用户打开Android任务管理器。
  3. 用户从任务管理器中滑动/删除应用程序(注意:应用程序服务仍在后台运行。我的应用程序在后台所做的一切工作正常,应用程序的持久通知仍然可用)
  4. GCM推送通知将发送到设备/应用程序
  5. 我的WakefulBroadcastReceiver没有收到推送通知。在某些设备上,应用程序也会死亡(持久通知也将被删除)。在我的测试设备上,当持续通知保持时,我注意到来自logcat的以下日志,但我的应用程序似乎不再运行(logcat中没有应用程序的其他日志条目):07-20 12:46:36.930:I/GCM(1071):GCM消息foo.bar。blub 0:14373891986…07-20 12:46:36.940:I/ActivityManager(750):Killing 23750:foo.bar.blub/…(adj 0):remove task有一些信息,如果应用程序被迫退出(例如,这里或这里),应用程序无法处理GCM消息,但这不是我的情况。我的应用程序在后台运行,只有活动被删除。当出现错误场景时,我的应用程序没有额外的异常堆栈跟踪。我看不出我没有收到GCM消息的原因,甚至也看不到应用程序被杀死的原因

如果在连接到持久通知的服务中注册WakefulBroadcastReceiver,则会发生相同的错误。

附加信息

谷歌宣布了一种处理GCM消息的新方法,并鼓励用户做出改变。由于某些原因,我不能短期切换到新的方式。因此,我还没有验证新建议的方法。

编辑:切换到GcmRecencer时的附加日志信息:

08-06 18:33:01.909: W/libProcess group(815):无法打开 /acct/uid_10216/pid_4296/cgroup.procs:没有这样的文件或目录08-06 18:33:01.910: W/ActivityManager(815):在1000毫秒内计划重启崩溃的服务foo.bar.blub/.service.BubbleService08-06 18:33:01.957: I/art(4412):延迟启用-Xcheck: jni 08-06 18:33:01.958: I/ActivityManager(815): Start proc 4412:foo.bar.blub/u0a216用于广播foo.bar.blub/com.google.android.gms.gcm.GcmReceiver08-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个答案

吕高雅
2023-03-14

使用Google新建议的方式(使用一个GcmReceiver(com . Google . Android . GMS . GCM . GcmReceiver)和一个GcmListenerService)仍然会出现这个问题。一般问题似乎与这个bug有关。也许上面提到的解决方法对某些人有用。

 类似资料:
  • 我正在尝试使用GCM推送通知。我的设备已注册到服务器,并且我还创建了设备注册id。但当我试图从服务器发送消息时,消息不会到达已注册的设备。谁能帮帮我吗? 我的主要activity 软件包COM.ATI.GCM; 导入com.google.android.gcm.gcmRegistratar; 导入Android.os.AsyncTask; 导入Android.os.bundle; 导入androi

  • 问题内容: 我已经在我的应用中实现了GCM通知。我现在尝试在用户注销时注销该应用程序。我正在使用以下代码。执行此代码时,它将导致应用程序崩溃,并显示以下logcat: 这是代码: 问题答案: 将支持库更新为25.0.0后,我遇到了同样的问题。对我来说,更新下面的库之后,在应用程序gradle文件中,问题消失了。

  • 我已经看到了一些实现这一点的方法,但它们都是特定于平台的(本例中是iOS)。在PCL中是否有同样的方法?

  • 当应用程序在后台时,如何更新包含数据负载的Firebase推送通知?有没有办法在通知中指定通知id给Firebase API? 完整的项目在github https://github.com/akshatashan/FireBaseCloudMessagingDemo中

  • 我的应用程序有推送通知(FCM)。当应用程序在前台运行时,我可以在onMessageReceived()函数中获取数据负载。当应用程序在后台运行或应用程序完全关闭时,不会调用onMessageReceived()函数。我的问题是,当app在后台或关闭时,是否可能获得数据有效载荷? 提前道谢!

  • 我开发了一个React Native应用程序,当应用程序处于活动状态时,每次收到来自OneSignal的消息推送时都会崩溃。 错误是。 如果我在应用程序处于后台时收到通知,则没有问题。 这是我的身材。gradle文件: 还有我的应用/构建。gradle文件: 你知道问题来自哪里吗?