ANR系列:广播触发ANR的原理

Posted zhangjin1120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ANR系列:广播触发ANR的原理相关的知识,希望对你有一定的参考价值。

广播处理顺序为先处理并行广播,再处理当前有序广播。

无序广播和有序广播的区别:

  • 平时使用的广播默认就是无序广播,也叫普通广播。无序广播不可以被拦截,不可以被终止,不可以被修改,无序广播任何接收者只要匹配条件都可以接收到,无优先级问题。无需广播是异步执行的,接受顺序不确定。
  • 有序广播是按照接收者的优先级接收,只有一个广播接收者能接收信息,在此广播接收者中逻辑执行完毕后,才会继续传递。

广播造成ANR的原理是什么?

  • 广播在被处理时,会发送一个Handler延时消息,消息存储在名为“AcitivityManager”线程的MessageQueue里面,这个线程是由system_process进程启动的,对这一点不熟悉的话,可以参考:Android中线程模型。Service的超时消息也发送给这个线程。倒计时期间,如果这个消息没有被取消,那么倒计时结束时,Handler会处理这个消息,就会弹出ANR弹窗。

无序广播会不会造成ANR?

  • 有序广播:有序广播存储在队列中,准备发送下一个有序广播的时候,首先会判断,上一个广播是否已经超时,如果超时,就会产生anr,即broadcasttimoutlocked。如果没有超时,就会取消之前的timeout(cancelbroadcasttimeoutlocked),在发送给下一个广播之前,首先发一个超时的消息(setbroadcasttimeoutlocked),这样就连环起来了。
  • 无序在发送时不会anr,但是如果在onreseive中耗时操作,onReceive在主线程,那么还是会产生anr,只不过这个anr发生在Activity中,属于input事件类型的anr了。

有序广播和无序广播anr问题
有序广播的基本使用
Android中的有序和无序广播浅析

以上是关于ANR系列:广播触发ANR的原理的主要内容,如果未能解决你的问题,请参考以下文章

Android ANR 触发原理

ANR系列:Service触发ANR的源码分析

ANR系列之二:Input类型ANR产生原理讲解

为什么会触发ANR,从源码中扒一扒

为什么会触发ANR,从源码中扒一扒

Android带你细看Android input系统中ANR的机制