我们知道Android中的广播(Broadcast)主要用于应用间的通信,这种通信机制依赖于Binder通信机制及AMS的参与。
当我们想实现应用内部组件之间的一对多通信时,广播机制的效率和开销可能无法满足要求。
这个时候我们可以使用第三方提供的开源库,例如EventBus等,
也可以使用Android支持库提供的LocalBroadcastManager。
本篇博客主要记录一下LocalBroadcastManager的基本用法,
同时分析一下LocalBroadcastManager的源码,看看其功能实现的原理。
1、基本用法
我实现一个简单的场景:
APK中有两个Activity,第一个Activity利用LocalBroadcastManager注册广播接收器,点击界面按键后启动第二个Activity。
进入第二个Activity后,点击按键就会通过LocalBroadcastManager发送广播,然后结束该Activity。
如果第一个Activity注册的广播接收器收到广播,就弹出一个Toast进行提示。
整个APK的功能极其简单,但基本囊括了LocalBroadcastManager的主要接口。
第一个Activity的代码如下:
public class FirstActivity extends AppCompatActivity {
private LocalBroadcastReceiver mReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
//创建一个BroadcastReceiver,与常规广播一样,自己实现子类即可
mReceiver = new LocalBroadcastReceiver();
//调用LocalBroadcastManager的接口进行注册,参数与常规Broadcast一致
LocalBroadcastManager.getInstance(this)
.registerReceiver(mReceiver, new IntentFilter("ZJTest"));
Button button = (Button)findViewById(R.id.first_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击按键后,启动第二个Activity
Intent i = new Intent();
i.setClass(getApplicationContext(), SecondActivity.class);
startActivity(i);
}
});
}
private class LocalBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//收到广播后,用Toast提示
Toast.makeText(context, "Receive Local Broadcast", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//利用LocalBroadcastManager的接口,进行反注册
LocalBroadcastManager.getInstance(this)
.unregisterReceiver(mReceiver);
}
}
我们再来看看SecondActivity的代码:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button button = (Button) findViewById(R.id.second_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击按键后,利用LocalBroadcastManager的接口发送本地广播
LocalBroadcastManager.getInstance(getApplicationContext())
.sendBroadcast(new Intent("ZJTest"));
finish();
}
});
}
}
从上面的代码可以看出,LocalBroadcastManager的使用极其简单。
与常规Broadcast相比,就是将Context对象替换为LocalBroadcastManager即可。
2、源码分析
现在我们来看看LocalBroadcastManager相关的源码。
2.1 构造函数
我们首先看一下LocalBroadcast构造函数相关的代码:
.................
static final int MSG_EXEC_PENDING_BROADCASTS = 1;
private final Handler mHandler;
private static final Object mLock = new Object();
//静态变量
private static LocalBroadcastManager mInstance;
//获取LocalBroadcastManager的接口
public static LocalBroadcastManager getInstance(Context context) {
//很明显,这是单例模式的写法
synchronized (mLock) {
if (mInstance == null) {
mInstance = new LocalBroadcastManager(context.getApplicationContext());