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时,这个函数不会等待这个广播被处理完后才返回)。

   
《Android - Broadcast机制》 虚线上面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函数进行处理。

 

 

    原文作者:_Doing
    原文地址: http://www.cnblogs.com/Doing-what-I-love/p/5530380.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞