静态广播发送流程分析
上篇文章分析的是动态广播(NR>0 因为是在动态 regist 的时候会把 bf 添加到 mReceiverResolver 这个 AMS 本地变量中,如果是静态的是查询不到 mReceiverResolver 变量里面的 bf),接下来分析静态注册的广播,静态注册的广播 receivers 不为 null。
小结:1.先获取动态注册的广播和静态注册的广播,并将这些广播分别存储到两个不同的列表中
2.判断是否是发送的普通广播,如果是,并且动态注册的广播,则先将动态注册的广播发送, 走后续的广播发送流程,接着判断是否有静态广播,如果有静态广播,则发送静态广播。(从源码代码逻辑可以知道,普通广播的发送,是动态广播优先静态广播发送)如果发送的是有序广播,则会将第一步的两个列表合并到 receivers 列表中,并按照优先级对广播进行排序,具体的排序规则是,优先级高的排前面,对于相同优先级的,动态优先静态,对于优先级相同,广播类型相同,如果都是动态广播类型,则先注册的优先后注册的,对于都是静态广播类型,则先扫描的由于后扫描的。
3.将广播将第二步的广播列表,添加到 BroadcastQueue 的 mParallelBroadcasts 或者 mOrderedBroadcasts 中,如果广播按照普通方式发送,则将广播存储在 mParallelBroadcasts 列表中,如果是静态广播存储在 mOrderedBroadcasts 列表中,如果发送方式是有序广播,则将所有的广播(不管是静态注册的还是动态注册的)都存储在 mOrderedBroadcasts 列表中。
动态广播:通过调用 BroadcastQueue 的 enqueueOrderedBroadcastLocked 方法将发送的广播存储在 BroadcastQueue 的 mParallelBroadcasts 列表中,然后通过 scheduleBroadcastsLocked 方法发送广播。
这里的 mBroadcastsScheduled 表示 ActivityManagerService 当前是不是正在处理其它广播,如果是的话,这里就先不处理直接返回了,保证所有广播串行处理。注意这里处理广播的方式,它是通过消息循环来处理,每当 AMS 接收到一个广播时,它就把这个广播放进自己的消息队列去就完事了,根本不管这个广播后续是处理的,因此,这里我们可以看出广播的发送和处理是异步的。这里的成员变量 mHandler 是一个在 ActivityManagerService 内部定义的 Handler 类变量,通过它的 sendEmptyMessage 函数把一个类型为 BROADCAST_INTENT_MSG 的空消息放进 AMS 的消息队列中去。这里的空消息是指这个消息除了有类型信息之外,没有任何其它额外的信息,因为前面已经把要处理的广播信息都保存在 mParcelBroadcasts 中了,等处理这个消息时,从 mParcelBroadcasts 就可以读回相关的广播信息了,因此,这里不需要把广播信息再放在消息内容中。
评论