求助:解决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,可针对崩溃集中的版本,调整广播异步处理逻辑,规避问题。
- 部分Android版本在
内容的提问来源于stack exchange,提问作者tech.mohit.garg
相关产品推荐
相关产品推荐

