Android sendBroadcast的过程分析
发送广播的过程分两步完成
第一步 AMS收到广播之后找到对应的广播接收者并把他们添加到一个广播调度队列中,这个步骤包含两个过程:
1、广播发送者把特定的广播发送给ActivityManagerService
2、AMS收到广播之后找到对应的广播接受者并把他们添加到一个广播调度队列中,在将这个队列传递给BroadcastQueue,最后向消息队列发送一个BROADCAST_INTENT_MSG的消息
具体调用过程如下:
在(ActivityManagerService)调用broadcastIntentLocked(),在这个方法里面会根据发送广播的intent找到对应的广播接收者,其中动态的无序广播接收者保存到BroadcastRecord的mParallelsBroadcats的队列里,动态有序的广播接收者和静态广播保存在BroadcastRecord的mOrderBroadcasts队列里,在这个方法里是先处理动态广播然后是处理静态广播的,所以相同级别的广播动态广播比静态广播收到的更早
第二步 BroadcastQueue从广播调度队列中找到对应的广播接收者,并把他们发送给对应的进程,当广播接收者进程收到消息后并不是直接发消息给广播接收者而是先发消息给主线程,然后主线程在发消息给对应的广播接收者,这个步骤也包含两个过程:
1、当消息队列中的BROADCAST_INTENT_MSG消息被处理时,BroadcastQueue会从广播调度队列找到对应的广播接收者,并把他们发送到接收者的进程
2、当广播接收者进程收到广播之后不是立马发消息给广播接收者而是将接收到的广播封装成一个消息发给主线程,等主线程轮询到对应的消息再发对应的广播到广播接收者
具体过程如下:
(BroadcastQueue)processNextBroadcast()这个方法里面会把广播队列里面的广播取出来并发送到对应的接收者进程去,对于动态广播则直接发送就好对于静态广播线判断对应的进程有没有启动,如果没有启动则先启动对应的进程,然后把广播封装成一个消息发送到主线程,不过动态广播和静态广播发送的流程不一样
动态广播:processNextBroadcast()->deliverToRegisteredReceiverLocked()->performReceiveLocked()->(applicationThread(ActivityThread))scheduleRegisteredReceiver()->(ReceiverDispatcher(loaderApk))performReceiver()->receiver.onReceiver()
静态广播:processNextBroadcast()->processCurBroadcastLocked()->(applicationThread(ActivityThread))scheduleReceiver()->handleReceiver()->receiver.onReceiver()
参考见:http://blog.****.net/zhangyongfeiyong/article/details/52022935