Android - Broadcast机制

以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):
http://blog.csdn.net/luoshengyang/article/details/8923485
http://blog.csdn.net/luoshengyang/article/details/12957169

 

整理by Doing

 

概括:
  1. 广播的接收者把广播接收器通过Binder进程间通信机制注册到ActivityManagerService中
  2. 广播的发送者同样是通过Binder进程间通信机制把广播发送到ActivityManagerService中,由ActivityManagerService去查找注册了这个广播的接收者,然后把广播分发给它们。分发的过程,其实就是把这个广播转换成一个消息,然后放入到接收器所在的线程消息队列中去,最后就可以在消息循环中调用接收器的onReceive函数了。这里有一个要非常注意的地方是,由于ActivityManagerService把这个广播放进接收器所在的线程消息队列后,就返回了,它不关心这个消息什么时候会被处理(对广播的处理是异步的,即调用sendBroadcast时,这个函数不会等待这个广播被处理完后才返回)。
 

 
虚线上面Step 1到Step 4步( 注册广播接收器的过程 ):
          Activity、Service、ContextWrapper和ContextImpl 这四个类的关系可以参考前面 Android应用程序注册广播接收器(registerReceiver)的过程分析 一文中描述的Activity类图。 (Activity和Service类都继承了ContextWrapper类
          Android应用程序(Context) 通过调用ContextWrapper类 的registerReceiver函数来把广播接收器BroadcastReceiver注册到ActivityManagerService中去的,而ContextWrapper类本身又借助ContextImpl类来注册广播接收器
Step 2  LoadedApk 负责处理广播的接收, 通过LoadedApk.getReceiverDispatcher在LoadedApk内部创建了一个IIntentReceiver接口(一个Binder对象), 传递给ActivityManagerService ActivityManagerService在收到相应的广播时,就是通过这个Binder对象来通知MainActivity来接收的。 通过Binder驱动程序就进入到ActivityManagerService中的registerReceiver函数中去
          同时,LoadedApk.getReceiverDispatcher中有HashMap 以Context为Key值保存在LoadedApk的成员变量mReceivers中,这样,只要给定一个Activity和BroadcastReceiver,就可以查看LoadedApk里面是否已经存在相应的广播接收发布器ReceiverDispatcher了
 
 
虚线下面的Step 5到Step 11( 发送广播的过程 ):
          Step 8中,ActivityManagerService利用上面得到的IIntentReceiver远程接口 (一个Binder对象) ,调用LoadedApk.performReceiver接口,LoadedApk.performReceiver接口通过ActivityThread.H接口(继承自Handler,用来分发ActivityManagerService发送过的广播)的post函数将这个广播消息放入到ActivityThread的消息队列中去,最后这个消息在LoadedApk的Args.run函数中处理,LoadedApk.Args.run函数接着调用MainActivity.BroadcastReceiver的onReceive函数来最终处理这个广播:
  1. 广播发送者通过sendBroadcast把一个广播通过Binder进程间通信机制发送给ActivityManagerService,ActivityManagerService根据这个广播的Action类型找到相应的广播接收器,然后把这个广播放进自己的消息队列中去,就完成第一阶段对这个广播的异步分发了;
  2. ActivityManagerService在消息循环中处理这个广播,并通过Binder进程间通信机制把这个广播分发给注册的广播接收分发器ReceiverDispatcher,ReceiverDispatcher把这个广播放进MainActivity所在的线程的消息队列中去,就完成第二阶段对这个广播的异步分发了;
  3.  ReceiverDispatcher的内部类ArgsMainActivity所在的线程消息循环中处理这个广播,最终是将这个广播分发给所注册的BroadcastReceiver实例的onReceive函数进行处理。
 

 

转载于:https://www.cnblogs.com/Doing-what-I-love/p/5530380.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值