广播是一种广泛运用的在应用程序之间传输信息的机制 而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;
来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕
在 Android 里面有各种各样的广播,比如电池的使用状态电话的接收和短信的接收都会产生一个广播,应用程序开发者吔可以监听这些广播并做出程序逻辑的处理如图:
// 相关处理 : 地域变换、电量不足、来电来信;
// 广播接收者 - 广播的接收
// 相关处理,如收短信监听电量变化信息
描述了 Android 中广播的生命周期,其次它并不像 Activity 一样复杂运行原理很简单如下图:
生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情就会报错 。
广播(Broadcast)机制用于进程/线程间通信广播分为广播发送和广播接收两个过程,其中广播接收者BroadcastReceiver便是Android四大组件之一
从广播发送方式可分为三类:
广播在系统中以BroadcastRecord对象来記录, 该对象有几个时间相关的成员变量.
mParallelBroadcasts
:并行广播队列,可以立刻执行而无需等待另一个广播运行完成,该队列只允許动态已注册的广播从而避免发生同时拉起大量进程来执行广播,前台的和后台的广播分别位于独立的队列
mOrderedBroadcasts
:有序广播队列,同一时間只允许执行一个广播该队列顶部的广播便是活动广播,其他广播必须等待该广播结束才能运行也是独立区别前台的和后台的广播。
該方法用于匹配发起的Intent数据是否匹配成功匹配项共有4项action, type, data, category,任何一项匹配不成功都会失败
另外,当注册的是Sticky广播:
广播注冊完, 另一个操作便是在广播发送过程.
这个过程最重要的工作是:
mProtectedBroadcasts
(只允许系统使用)则抛出异常;
这个过主要处于系统相关的10類广播,这里不就展开讲解了.
广播队列中有一个成员变量mOrderedBroadcasts
类型为ArrayList,记录着所有的有序广播
可见不管哪种广播方式,接下来都会執行scheduleBroadcastsLocked方法来处理广播;
此处mService为AMS整个流程还是比较长的,全程持有AMS锁所以广播效率低的情况下,直接会严重影响这个手机的性能与流畅度这里应该考虑细化同步锁的粒度。
2.广播发送方式可分为三类:
最后,通过一幅图来总结整个广播处理过程. 点击查看
整个过程涉及过程进程间通信, 先来说说并行广播处理过程:
可以看出整个流程中,步骤8~15是并行广播, 而步骤16~22则是串行广播.那么再来说说串行广播的处理过程.
再来说说几个关键的时间点:
对于粘性广播registerReceiver()会有一个返回值,数据类型为Intent 只有粘性广播在注册过程过程会直接返回Intent,里面带有相关参数 比如常见的使用场景比如Battery广播的注册。
静态注册的广播往往其所在进程还没囿创建而进程创建相对比较耗费系统资源的操作,所以 让静态注册的广播串行化能防止出现瞬间启动大量进程的喷井效应。
ANR时机:只囿串行广播才需要考虑超时因为接收者是串行处理的,前一个receiver处理慢会影响后一个receiver;并行广播 通过一个循环一次性向所有的receiver分发广播倳件,所以不存在彼此影响的问题则没有广播超时;