1. 程式人生 > >訊息傳遞機制之元件之間訊息傳遞

訊息傳遞機制之元件之間訊息傳遞

通常在元件之間傳遞訊息,我們會採用廣播形式 , 自定義介面形式 , 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解決元件間訊息的傳遞

以上是個人對於元件間訊息傳遞的一些見解和總結,要是有什麼不對的地方,歡迎各位同仁指正