第2部分会分析分发过程
> 广播分发的流程图
这张图描述了整个广播分发的流程,
为了简化,
这一节只从 AMS 的 processNextBroadcast 开始分析
备注:这个方法在6.0的时候移到了 BroadQueue 类中, AMS 的代码也有相应的调整
> 有序广播和普通广播
首先在广播里有两种形式,
分别保存在 BroadcastQueue 类的两个对象里
在广播分发逻辑中,
首先会处理并行广播,也就是普通广播,
同时把广播分发到所有能接收这个广播的 Receiver 去,
有序广播就是一个个来了
> processNextBroadcast( ) -- Parallel Broadcast
普通广播在 processNextBroadcast 一开始就进行分发,
比较简单,
每次从 mParallelBroadcasts<> 中取出并同时删除最前面的 BroadcastRecord 对象,
这个类保存了包括广播消息内容、时间、处理Receiver等信息
在循环中不断取出 BroadcastRecord 对象,
用 deliverToRegisteredReceiverLocked 进行分发,
到了这里就很容易理解了,
app.thread.scheduleRegisteredReceiver ,这里是跨进程调用,
后面就是到 ActivityThread 中去调不同的 receiver.performReceive了。
之后的事情概括地解释就是 post 一个带有 receiver 的 runnable 对象,去做 onReive 操作。
> processNextBroadcast( ) -- Serialized Broadcast
有序广播的分发包括了静态和动态注册的分发,
这里就分了两个逻辑,
在分发完 Parallel 广播后,还有一大段的广播超时机制,
这里略过,直接看 Serialized 广播的分发,
前面说过 BroadcastFilter 类型的实例是动态注册的 Receiver,
静态类型广播分发到这里是先把 动态注册 的发出去,然后又看到熟悉的 deliverToRegisteredReceiverLocked() 了,
这个方法接下去的部分照旧,忽略不写。
然后,
到这里就是有序广播的静态注册 Receiver 分发了,
在这段代码之前有一部分判断对应的 Receiver 有没有对应的 Process 存在,
如果没有要先把这个 Process 调起来,
最后会走 processCurBroadcastLocked(),
而这个方法也是通过跨进程调用去执行静态注册的 Receiver 的 onReceive 方法,
上面代码中的 app, thread, 跨进程调用,
scheduleReceiver() 在 ActivityThread 中的逻辑是 sendMessage 到 H 中,
然后 handleMessag 会去调 Receiver 的 onReceive 方法。
总结,
对于广播注册来说,分为静态注册和动态注册,
分别会用 ResolveInfo 和 BroadcastFilter 来实例化,
对于广播类型,也分有序广播和普通广播。
广播分发,是先发普通广播,Parallel Broadcast,一次发给所有 Receiver
然后在发有序广播 Serialized Broadcast 的时候,先发给动态注册的Receiver,再发给静态注册的 Receiver。
而静态注册的 Receiver 通过 H 去分发消息。