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系列:广播触发ANR的原理的主要内容,如果未能解决你的问题,请参考以下文章