Android Framework 面试系列(七)Broadcast

275 阅读2分钟

在 Android 中,有两种广播注册方式,分别是动态注册和静态注册。

动态广播注册和接收的流程

image.png

动态广播注册和接收的流程如上图所示,具体流程如下:

  1. 通过 ActivityManagerProxy 代理,调用到 AMS 的 registerReceive 方法。该方法会传入 IIntentReceiver 对象(IIntentReceiver 弱引用ReceiverDispatcher,ReceiverDispatcher引用BroadcastReceiver),它是一个 Binder 对象 ,通过该对象可以调用到BroadcastReceiver的onReceived()函数。
  2. 其他进程通过 ActivityManagerProxy 代理,调用到 AMS 的 broadcastIntent 方法来发送广播
  3. broadcastIntent 方法会传入 Intent 参数,AMS会在所有注册了的Receiver里根据intent找到匹配的Receiver,然后开始分发
  4. 分发调用的 ApplicationThreadProxy的 scheduleRegisteredReceiver 方法。
  5. 对于普通的动态广播来说,AMS是并行分发的,但是 广播到达应用端之后变成了串行化分发
  6. 通过binder对象找到对应的BroadcastReceiver然后执行它的onReceived函数

静态广播注册和接收与静态广播的区别

注册的区别

静态注册的广播,它会被注册到 PKMS 中,而不是 AMS 中。具体流程如下:

  1. Android在启动的时候会启动PackageManagerService服务,这个服务会去扫描已经安装的APK,解析里面的AndroidManifest文件。
  2. 当解析到TAG=="receiver"时,将去解析xml中的配置,并生成一个应用组件对象
  3. 把a加入到receivers列表里面,静态广播就是这时候被注册到PKMS里的,当需要的时候再从PKMS中查找

接收的区别

当其他进程发送广播时,AMS 会根据传入的 Intent,寻找有哪些 receiver 可以接收这个广播。把寻找到的 receiver 放到一个分发队列中去(静态注册和动态注册的都在一起)。

分发时,如果是这个receiver是动态注册的receiver,就直接分发;如果这个receiver是静态注册的 receiver,就先看进程是否启动。如果启动进程启动了,就直接分发,没启动的话就先启动进程,然后给广播标记为pending。进程启动后attachApplication时继续处理这个pending的广播。

参考