You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:解决Firebase Crashlytics上报的Broadcast already finished崩溃问题

解决java.lang.IllegalStateException: Broadcast already finished崩溃的思路

崩溃日志

Fatal Exception: java.lang.IllegalStateException: Broadcast already finished
   at android.content.BroadcastReceiver$PendingResult.sendFinished(BroadcastReceiver.java:248)
   at android.content.BroadcastReceiver$PendingResult$1.run(BroadcastReceiver.java:221)
   at android.app.QueuedWork.processPendingWork(QueuedWork.java:258)
   at android.app.QueuedWork.-wrap0()
   at android.app.QueuedWork$QueuedWorkHandler.handleMessage(QueuedWork.java:278)
   at android.os.Handler.dispatchMessage(Handler.java:105)
   at android.os.Looper.loop(Looper.java:164)
   at android.os.HandlerThread.run(HandlerThread.java:65)

核心原因

该异常是因为代码尝试对已完成(调用过finish()或自动结束)的广播PendingResult再次调用sendFinished(),系统不允许重复标记广播完成状态。

排查与解决方向

  • 检查自定义广播接收逻辑

    • 确认在onReceive()中调用goAsync()获取PendingResult后,是否存在多次调用finish()的情况;
    • 禁止在onReceive()执行完毕后,再操作已失效的PendingResult对象。
  • 排查第三方SDK的广播处理

    • 检查集成的推送、统计类第三方SDK,部分SDK内部可能存在不当处理广播的逻辑,触发该异常;
    • 针对系统广播(如开机、网络状态广播),避免在异步回调中延迟处理已完成的广播结果。
  • 控制异步操作边界

    • 使用goAsync()做后台广播任务时,通过标记位或原子变量确保任务完成后仅调用一次finish();
    • 避免在广播生命周期外(如关联的Activity/Fragment销毁后)持有并操作PendingResult。
  • 版本兼容性处理

    • 部分Android版本在QueuedWork处理上存在系统级小概率bug,可针对崩溃集中的版本,调整广播异步处理逻辑,规避问题。

内容的提问来源于stack exchange,提问作者tech.mohit.garg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:22:42