广播发送流程

广播的发送者将广播发送到ActivityManagerService,ActivityManagerService接收到这个广播以后,就会在自己的注册中心查看有哪些广播接收器订阅了该广播,然后把这个广播逐一发送到这些广播接收器中,但是ActivityManagerService并不等待广播接收器处理这些广播就返回了,因此,广播的发送和处理是异步的。概括来说,广播的发送路径就是从发送者到ActivityManagerService,再从ActivityManagerService到接收者,这中间的两个过程都是通过Binder进程间通信机制来完成的

1.在Activity中发送广播,sendBroadCast方法其实是调用了ContextWrapper的sendBroadcast方法,ContextWrapper类中的sendBroadcast方法,其实也是调用了ContextImpl的sendBroadcast方法 这里的resolvedType表示这个Intent的MIME类型

在这里插入图片描述

  1. 这个方法中,通过进程间通信的的方式,调用了system_server进程的ActivityManagerService的broadcastIntent方法 在这里插入图片描述

在里面调用了broadcastIntentLocked方法,拆开进行分析: 3. 首先对Intent进行了处理,如果broadCastReceiver所在进程死亡那么将不会收到该广播 在这里插入图片描述

  1. 如果广播没有指定特性的接受者的话那么会调用到mReceiverResolver.queryIntent()这个方法中,在上面注册的时候BroadcastFilter实例保存在了ActivityManagerService的成员变量mReceiverResolver中,这个BroadcastFilter实例包含了我们所注册的广播接收器,这里就通过mReceiverResolver.queryIntent函数将这个BroadcastFilter实例取回来。由于注册一个广播类型的接收器可能有多个,所以这里把所有符合条件的的BroadcastFilter实例放在一个List中,然后返回来。 在这里插入图片描述

  2. 这里是查看一下这个intent的Intent.FLAG_RECEIVER_REPLACE_PENDING位有没有设置,如果设置了的话,AMS就会在当前的系统中查看有没有相同的intent还未被处理,如果有的话,就有当前这个新的intent来替换旧的intent。 在这里插入图片描述

  3. 这个if语句首先创建一个广播记录块BroadcastRecord,里面记录了这个广播是由谁发出的以及要发给谁等相关信息。由于前面得到的replacePending变量为false,这里得到的replaced变量的值也为false,于是执行下面的if语句,没有替换时,才需要将新的广播加入到BroadcastQueue.mParallelBroadcasts队列中,等待进一步处理;进一步处理的操作由函数scheduleBroadcastsLocked进行。处理完成之后会把NR重置

在这里插入图片描述