訊息傳遞機制之元件之間訊息傳遞
阿新 • • 發佈:2019-01-28
通常在元件之間傳遞訊息,我們會採用廣播形式 , 自定義介面形式 , EventBus來實現
BroadCastReceiver
建立廣播
private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("com.quanzi.test")) { Log.d(TAG,"接收到廣播"); String msg = intent.getStringExtra("msg"); Toast.makeText(mContext,"接收到的訊息..." +msg,Toast.LENGTH_LONG).show(); } } };
註冊廣播
IntentFilter filter = new IntentFilter("com.quanzi.test");
//設定廣播優先順序
filter.setPriority(100);
registerReceiver(receiver, filter);
解除廣播
unregisterReceiver(receiver);
傳送廣播Intent intent = new Intent(); intent.setAction("com.quanzi.test"); //保證只被專案內的廣播接收者接收 intent.setPackage(getPackageName()); intent.putExtra("msg", "傳送訊息"); sendBroadcast(intent);
廣播的相關細節就不作詳細說明 ,大家要是有不懂的可以找找資料
自定義事件監聽介面
建立事件監聽介面
public interface DataListener {
void receiveData(String str);
}
資料監聽管理
public class DataListenerManager { //監聽集合 private LinkedList<DataListener> listListener = new LinkedList<>(); private static DataListenerManager dataListenerManager; private Handler mHandler = new Handler(); public static DataListenerManager getInstance() { if (dataListenerManager == null) { synchronized (DataListenerManager.class) { if (dataListenerManager == null) { dataListenerManager = new DataListenerManager(); } } } return dataListenerManager; } //新增資料監聽 public void addDataListener(DataListener dataListener){ if (listListener == null){ listListener = new LinkedList<>(); } if (!listListener.contains(dataListener)){ listListener.add(dataListener); } } //移除資料監聽 public void removeDataListener(DataListener dataListener){ if (listListener == null){ return; } if (listListener.contains(dataListener)){ listListener.remove(dataListener); } } //移除所有的資料監聽 public void releaseAllDataListener(){ if (listListener != null){ listListener.clear(); listListener = null; } } //傳送資料 public void sendData(final String data){ if (listListener == null){ listListener = new LinkedList<>(); } mHandler.post(new Runnable() { @Override public void run() { for (DataListener dataListener :listListener ) { dataListener.receiveData(data); } } }); } }
使用
宣告一個監聽
DataListener dataListener = new DataListener() {
@Override
public void receiveData(String str) {
}
};
新增監聽
DataListenerManager.getInstance().addDataListener(dataListener);
移除監聽
DataListenerManager.getInstance().removeDataListener(dataListener);
傳送訊息並觸發監聽
DataListenerManager.getInstance().sendData("傳送訊息");
監聽和BroadCastReceiver比較
優點
1. 相比較廣播傳輸安全一些,但是對於監聽數量過多,可能導致效率偏低
2. 相比較廣播不用每一個Activity定義,註冊,降低了工作量和維護成本
缺點
1. 不能像廣播一樣設定優先順序
2.不能終止訊息的傳遞
3. 不能修改訊息
EventBus使用
EventBus實現元件間訊息的傳遞,在這裡不作說明,要是有什麼不懂的可以看看訊息傳遞機制之EventBus使用詳解
個人推薦使用EventBus解決元件間訊息的傳遞
以上是個人對於元件間訊息傳遞的一些見解和總結,要是有什麼不對的地方,歡迎各位同仁指正