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中的有序和无序广播浅析

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值