總線(Bus)是指計(jì)算機(jī)組件間規(guī)范化的交換數(shù)據(jù)(data)的方式含滴,即以一種通用的方式為各組件提供數(shù)據(jù)傳送和控制邏輯虽缕。
大家知道安卓廣播使用類似發(fā)布-訂閱設(shè)計(jì)模式台妆,事件總線也是類似機(jī)制础锐,可以方便的在安卓應(yīng)用組件間通信扶叉,傳輸數(shù)據(jù)勿锅;
安卓常用的第三方事件總線有Otto、EventBus枣氧、RxBus等溢十;
Otto 已經(jīng)廢棄并推薦使用 RxBus,EventBus 上一次發(fā)布是在一年前作瞄,
現(xiàn)在因項(xiàng)目中不能引入 RxJava茶宵,又想避免 BroadcastReceiver
帶來的安全問題,谷歌在 v4 包中引入了 LocalBroadcastManager
宗挥,可以方便安卓開發(fā)者使用總線機(jī)制帶來的便利。
LocalBroadcastManager 的使用
與動(dòng)態(tài)注冊(cè)系統(tǒng)廣播類似
- 定義一個(gè)廣播接收器:
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "onReceive: " + intent.getStringExtra("event"));
}
};
- 注冊(cè)本地廣播:
@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);
}
- 發(fā)布廣播
mView.setOnClickListener(v -> {
Intent intent = new Intent();
intent.setAction(MAIN_ACTION);
intent.putExtra("event", "---");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
});
組件間通信如此 so easy ??