安卓广播超时的缘由分析及优化建议

前言

最终工做中常常碰到广播超时的问题,因而花精力总结了一番,各位客官请看~android

基本概念

普通广播与有序广播

  • 普通广播
    普通广播是彻底异步的,逻辑上能够在同一时刻被全部匹配的接受者接收到,消息传递效率高,缺点是接受者不能将处理结果传递给下一个接收者,也没法终止广播传播。
    普工广播是并行广播。
  • 有序广播
    有序广播的接收者们将按照事先生命的优先级依次接收,数越大优先级越高(取值范围:-1000~10000),优先级能够声明在<intent-filter android:priority="n".../>,也能够调用IntentFilter对象的setPriority设置。而且接收者能够终止传播(调用abortBroadcast()方法便可终止),一旦终止后面接收者就没法接受广播。另外,接受者能够将处理结果存入数据(可经过setResultExtras(Bundle)方法将数据存入Broadcast),当作Broadcast再传递给下一级接收者(可经过代码Bundle bundle = getResultExtras(true)获取上一级传递过来的数据)。
    有序广播是串行广播。

有序广播的发送

各个时间点

  • enqueueClockTime 一次广播插入到广播队列时的时间点,取System.currentTimeMillis()
  • dispatchTime 一次广播从广播队列中被取出,准备开始发送,取SystemClock.uptimeMillis()
  • dispatchClockTime 含义同dispatchTime,取System.currentTimeMillis()
  • receiverTime 一次广播中,开始派发给其中每一个接收者时的时间点,主要记录的是有序广播的状况,取SystemClock.uptimeMillis()。
  • finishTime 一次广播完成时的时间点
    每次把广播发送给一个接受者以后会去检查当前时间与dispatchTime 时间差是否大于超时时间,大于时就是ANR超时

时序图

广播超时时序图.jpg异步

从图中能够看出决定广播B接受者的广播接受是否超时,取决于广播A处理的时间和广播B处理的时间优化

超时的缘由

  • 同一个广播接收者较多,抢占了后面的接收者容许处理的时间。广播接受者较多也多是因为代码设计不合理,注册了广播监听没有解注册有关。
  • Binder被耗尽,致使Binder通讯时间较长,挤压了广播处理的时间
  • 广播接受的onReceive中作了繁重的任务
  • 系统资源紧张,CPU处理时间被抢占

优化建议

  • 保证广播监听的注册与解注册成对实现
  • 同一个应用对同一个广播的监听应该使用同一个监听者,不该该多处监听
  • 在广播的onreceive中不该该作繁重的任务
相关文章
相关标签/搜索