总线(Bus)是指计算机组件间规范化的交换数据(data)的方式,即以一种通用的方式为各组件提供数据传送和控制逻辑。
大家知道安卓广播使用类似发布-订阅设计模式,事件总线也是类似机制,可以方便的在安卓应用组件间通信,传输数据;
安卓常用的第三方事件总线有Otto、EventBus、RxBus等;
Otto 已经废弃并推荐使用 RxBus,EventBus 上一次发布是在一年前,
现在因项目中不能引入 RxJava,又想避免 BroadcastReceiver
带来的安全问题,谷歌在 v4 包中引入了 LocalBroadcastManager
,可以方便安卓开发者使用总线机制带来的便利。
LocalBroadcastManager 的使用
与动态注册系统广播类似
- 定义一个广播接收器:
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "onReceive: " + intent.getStringExtra("event"));
}
};
- 注册本地广播:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, new IntentFilter(MAIN_ACTION));
}
- 取消本地广播
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
}
- 发布广播
mView.setOnClickListener(v -> {
Intent intent = new Intent();
intent.setAction(MAIN_ACTION);
intent.putExtra("event", "---");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
});
组件间通信如此 so easy 😊