说说动态广播的注册和收发原理
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函数。
网友评论