远程服务异常:启动前台服务的通知有误:java.util.ConcurrentModificationException

17
android.app.RemoteServiceException: Bad notification for startForeground: java.util.ConcurrentModificationException
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2204)
  at android.os.Handler.dispatchMessage(Handler.java:108)
  at android.os.Looper.loop(Looper.java:166)
  at android.app.ActivityThread.main(ActivityThread.java:7523)
  at java.lang.reflect.Method.invoke(Method.java:-2)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

我已经收到这个崩溃报告有一段时间了。看起来只会在Android 8.0.0上发生。

@Synchronized
override fun toForeground(id: Int) {
    fun action() {
        startForeground(id, builder?.build())
    }
    if (Looper.myLooper() === Looper.getMainLooper()) {
        action()
    } else {
        Handler(Looper.getMainLooper()).post { action() }
    }
}

每个频道都已设置,该应用可以在Android 8.0.0及更高版本的设备上运行,测试期间没有遇到任何问题,除了我无法复制崩溃。

我想知道为什么会发生这种崩溃,并且如何修复它。

提前致谢。


你能展示一下堆栈跟踪和/或代码部分吗?我猜你使用集合来处理大量的通知消息,是吗? - Raskilas
@Raskilas 我已经添加了堆栈跟踪和代码。你是对的,我处理了一堆通知并将其中一个置为前台,但我仍然不知道为什么会触发 ConcurrentModificationException 异常。 - Dewey Reed
你找到关于这个问题的解决方案了吗? - yoonhok
我遇到了同样的崩溃问题,仅出现在Android 8.0上,并且目前只在华为设备(多种型号)上发生了100多次崩溃,最近有关于这个问题的任何进展或信息吗? - Kenumir
@Kenumir,我发布了一个新答案,对我来说似乎有效。祝你好运。 - Dewey Reed
显示剩余3条评论
3个回答

7

我也遇到了在 Android 8.0.0 设备上的这个崩溃问题,而且是随机发生的。

查阅 AOSP 源代码后,看起来问题出现在这一行: http://androidxref.com/8.0.0_r4/xref/frameworks/base/services/core/java/com/android/server/am/ServiceRecord.java#540

public void postNotification() {
...
} catch (RuntimeException e) {
    Slog.w(TAG, "Error showing notification for service", e);
    // If it gave us a garbage notification, it doesn't
    // get to be foreground.
    ams.setServiceForeground(name, ServiceRecord.this,
            0, null, 0);
    ams.crashApplication(appUid, appPid, localPackageName, -1,
            "Bad notification for startForeground: " + e);
}

我不确定在try块中哪一行代码导致了这个catch块,但我认为这是AOSP本身的一个漏洞。它异步地与通知进行操作。因此,当AOSP正在操作通知时,应用程序更新其通知的机会很大。


你找到任何关于这个的解决方案了吗? - yoonhok
通常情况下,根据 Firebase Crashlytics 的报告,这种情况经常发生在使用华为设备的用户身上。 - user924

2
华为?对我来说,这只是在Firebase Crashlytics中报告的华为设备。因此,这可能是该制造商的失败。真正糟糕的设备。 https://dontkillmyapp.com/huawei

0

我的应用有时会更改前台通知。我使用下面的代码后,已经有一段时间没有看到崩溃了。但我不确定它是否可以修复所有情况。

private val toForegroundHandler: Handler = Handler(Looper.getMainLooper())

@Synchronized
override fun toForeground(id: Int) {
    toForegroundHandler.removeCallbacksAndMessages(null)
    toForegroundHandler.postDelayed(16) {
        startForeground(id, builder.build())
    }
}

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