LocalBroadcastManager 的实现原理,Handler还是 Binder?

Posted wytiger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LocalBroadcastManager 的实现原理,Handler还是 Binder?相关的知识,希望对你有一定的参考价值。

原文: http://www.trinea.cn/android/localbroadcastmanager-impl/

 

对 LocalBroadcastManager 大家应该都不陌生,相对 BroadcastReceiver,它只能用于应用内通信,安全性更好,同时拥有更高的运行效率。也是需要发送应用内广播时的官方推荐。

 

大家也都知道BroadcastReceiver的通信是走 Binder 机制的,而 LocalBroadcastManager 因为叫LocalBroadcast,可能让人产生一种它也是以 Binder 通讯方式为底层实现的错觉,点进源码,我们会发现这个更安全高效的实现原来如此熟悉。

 

还是先简单提下 LocalBroadcastManager 使用,更多可见:BroadcastReceiver 详细介绍

 

1. LocalBroadcastManager 使用

LocalBroadcastManager 的使用跟一般 BroadcastReceiver 差别不大。

(1) 自定义 BroadcastReceiver 子类

 

 

 

(2) 注册接收器

 

 

 

(3) 发送广播

 

 

 

(4) 取消注册

 

 

 

2. 实现

LocalBroadcastManager 源代码可见:LocalBroadcastManager.java

(1) 构造函数

 

 

先看构造函数,单例实现因而私有化构造函数。
注意的是基于主线程的 Looper 新建了一个 Handler,handleMessage中会调用接收器对广播的消息进行处理,也是 LocalBroadcastManager 的核心部分,具体见后面executePendingBroadcasts()介绍。

 

单例函数还可以通过双层条件判断提高效率,双层条件判断的写法可见:单例模式

 

(2) 注册接收器

 

 

mReceivers 存储广播和过滤器信息,以BroadcastReceiver作为 key,IntentFilter链表作为 value。
mReceivers 是接收器和IntentFilter的对应表,主要作用是方便在unregisterReceiver(…)取消注册,同时作为对象锁限制注册接收器、发送广播、取消接收器注册等几个过程的并发访问。

 

mActions 以Action为 key,注册这个ActionBroadcastReceiver链表为 value。mActions 的主要作用是方便在广播发送后快速得到可以接收它的BroadcastReceiver

 

(3) 发送广播