Android Framework学习之动态广播的注册和收发原理

2022-12-13  本文已影响0人  一只二凡子

说说动态广播的注册和收发原理

IIntentReceiver: binder 对象,课跨进程传递,通过ActivityManagerNative.getDefault().registerReceiver(rd, filter, ...)传到AMS。

同一个BroadcastReceiver和不同的Context,对应不同的IIntentReceiver

以上是应用端注册广播

下面是AMS处理注册部分

ReceiverList:叫FilterList更合适

BroadCastFilter extends IntentFilter

一个IIntentReceiver可能对应多个IntentFilter:在一个activity里先用一个IntentFilter注册一个broadcast receiver,然后再用另外一个IntentFilter去注册同一个broadcast reciver,这样在AMS端一个IIntentReceiver就对应2个IntentFilter。

mReceiverResolver:IntentResolver, 用来解析Intent看是否匹配

广播注册原理完毕

动态广播默认是无序的,ordered == false

AMS里有两个BroadcastQueue,一个是分发紧急任务的,另一个是普通任务的

BroadcastQueue有两个列表,一个发并行分发的(动态广播默认是并行分发),一个是串行分发的

应用端自动将分发串行化,

TYPE_COMPONENT:静态广播

TYPE_UNREGISTERED:动态广播

sendFinished:通知AMS广播执行完了

应用A生成binder对象,向AMS注册广播,将binder对象和IntentFilter注册到AMS,应用B发送广播,广播里带了intent,AMS会在所有注册的Receiver里根据intent找到匹配的Receiver,然后就开始分发。对普通的动态广播,AMS是并行分发的,广播到了应用端是串行化分发,通过binder对象找到对应的broadcast receiver,然后执行它的onReceive函数。

上一篇下一篇

猜你喜欢

热点阅读