关于广播的分发
关于Android的广播分发会分两个篇章来介绍,先把结论放到最前。
1.对于广播注册来说,分为静态注册和动态注册,
分别会用 ResolveInfo 和 BroadcastFilter 来实例化,
2.对于广播类型,也分有序广播和普通广播。
3.广播分发,是先发普通广播,Parallel Broadcast,一次发给所有 Receiver
然后在发有序广播 Serialized Broadcast 的时候,先发给动态注册的Receiver,再发给静态注册的 Receiver。
而静态注册的 Receiver 通过 H 去分发消息。
这部分主要简单分析注册过程,
之前的了解结果,广播的处理可以在主线程和子线程,
主线程的情况,
会在 ActivityThread 的 H.handleMessage 处理从 ApplicationThread 分发过来的广播消息,
handleReceiver 会从消息中取出对应的 Receiver 去回调 onReceive 操作
子线程的情况,
需要在注册广播的时候传递一个子线程 handler 和 receiver进去,
然而胡巴@wx_huhuxjh126 研究过之后发现实际上 handler 不写任何 handleMessage 操作也可以,
ApplicationThread 在分发时会直接运行一个封装了 receiver 的 runnable 对象,
也就是说不需要通过 handleMessage 来回调 receiver.onReceive,
> 前提
分析广播的分发有个前提,需要了解广播注册的时候到底是注册什么到什么,
嗯哼先给出结论,
注册,是把一个实现了 Binder 类 IIntentReceiver 的 InnerReceiver 对象 注册到 ActivityManagerServer,
InnerReceiver --持有--> ReceiverDispatch --持有--> BroadcastReceiver 和 Handler
> 注册
不管是主线程的handler还是子线程的handler,
注册都是把一个实现了 IIntentReceiver 的 InnerReceiver 对象交给 AMS 去注册,
这段关于 InnerReceiver 的代码可以看出来,
InnerReceiver 是一个 IBinder ,
最终 AMS 也是使用这个东西来分发消息的。
ReceiverDispatcher,看名字可以猜这个东西既是用来接收也用来分发广播
下面顺便理一下 Activity 和针对各个不同广播的 Receiver 是怎样一种对应关系
在 LoadedApk 中,
有个对象 mReceiver,
ArrayMap<Context, ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>>
这货是用 context 作为 key, 来对应上面代码里这个 map,
ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>
而这个 map 是以 receiver 为 key,来对应各个不同的 ReceiverDispatcher 的,
也就是说只要给定一个 activity 和 BroadcastReceiver,就可以找到是否有对应的 ReceiverDispatcher 存在
> 注册 Binder
这里涉及的是 AIDL 的 Binder 注册过程,比较简单就省略分析了。
以上,
不涉及动态注册的广播和静态注册的广播的区别,
这两者会在分发的时候有不同的逻辑处理。
这里只提一下两者的 receiver 的不同,
静态注册的广播 Receiver 继承于 ResolverInfo
动态注册的广播 Receiver 继承于 BroadcastFilter