Android Broadcast 分析 ( 1 )

关于广播的分发

关于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 去注册,

Android Broadcast 分析 ( 1 )_第1张图片
Paste_Image.png

这段关于 InnerReceiver 的代码可以看出来,
InnerReceiver 是一个 IBinder ,
最终 AMS 也是使用这个东西来分发消息的。

ReceiverDispatcher,看名字可以猜这个东西既是用来接收也用来分发广播

下面顺便理一下 Activity 和针对各个不同广播的 Receiver 是怎样一种对应关系

Android Broadcast 分析 ( 1 )_第2张图片
Paste_Image.png

在 LoadedApk 中,
有个对象 mReceiver,
ArrayMap>
这货是用 context 作为 key, 来对应上面代码里这个 map,
ArrayMap
而这个 map 是以 receiver 为 key,来对应各个不同的 ReceiverDispatcher 的,
也就是说只要给定一个 activity 和 BroadcastReceiver,就可以找到是否有对应的 ReceiverDispatcher 存在

> 注册 Binder

Android Broadcast 分析 ( 1 )_第3张图片
Paste_Image.png

这里涉及的是 AIDL 的 Binder 注册过程,比较简单就省略分析了。

以上,
不涉及动态注册的广播和静态注册的广播的区别,
这两者会在分发的时候有不同的逻辑处理。
这里只提一下两者的 receiver 的不同,
静态注册的广播 Receiver 继承于 ResolverInfo
动态注册的广播 Receiver 继承于 BroadcastFilter

你可能感兴趣的:(Android Broadcast 分析 ( 1 ))