BroadcastReceiver

一、什麼是BroadcastReceiver?

  • 是android四大組件之一、是app內的全局監聽器,運行於主線程中;
  • 可以用於進程內通信,也可以用於進程間通信(跨進程通信);
  • 主要分爲兩種:無序廣播、有序廣播
    • 無序廣播:任何接收者都能收到廣播,效率高,但是接收者無法傳遞廣播,也不能截斷廣播
    • 有序廣播:接收者按照優先級的高低來接收廣播,每一個接收者都有權修改廣播,並將修改後的廣播內容傳遞給下一個接受者,每一個接收者也可以攔截廣播。

二、BroadcastReceiver的實現原理是什麼?

  • 設計模式:觀察者模式
  • 3個重要概念:廣播接收者、廣播的發送者、消息中心(AMS)
    廣播實現原理圖

原理描述

  • 廣播接收者 通過 Binder機制在 AMS 註冊
  • 廣播發送者 通過 Binder 機制向 AMS 發送廣播
  • AMS 根據 廣播發送者 要求,在已註冊列表中,尋找合適的廣播接收者(尋找依據:IntentFilter / Permission)
  • AMS將廣播發送到合適的廣播接收者相應的消息循環隊列中;
  • 廣播接收者通過 消息循環 拿到此廣播,並回調 onReceive()

注意:廣播的發送和接受是異步的,發送者不會關心有無接收者或者何時收到。

三、如何定義廣播接收者?

  • 繼承自BroadcastReceivre基類
  • 必須複寫抽象方法onReceive()方法
public class mBroadcastReceiver extends BroadcastReceiver {

 //接收到廣播後自動調用該方法 
 @Override
 public void onReceive(Context context, Intent intent) {
     //寫入接收廣播後的操作
     } 
}

四、如何註冊廣播接收器?

靜態註冊 動態註冊

  • 靜態註冊
    • 在AndroidManifest.xml裏通過標籤聲明
<receiver
    //此廣播接收者類是mBroadcastReceiver
    android:name=".mBroadcastReceiver" >
    //用於接收網絡狀態改變時發出的廣播
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
  • 動態註冊
    • 在代碼中通過調用Context的registerReceiver()方法進行動態註冊BroadcastReceiver
@Override
    protected void onResume() {
        super.onResume();
        //實例化BroadcastReceiver子類 & IntentFilter
        mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        //設置接收廣播的類型
        intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
        //調用Context的registerReceiver()方法進行動態註冊
        registerReceiver(mBroadcastReceiver, intentFilter);
    }
    //註冊廣播後,要在相應位置記得銷燬廣播
    // 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
    // 當此Activity實例化時,會動態將MyBroadcastReceiver註冊到系統中
    // 當此Activity銷燬時,動態註冊的MyBroadcastReceiver將不再接收到相應的廣播。
    @Override
    protected void onPause() {
        super.onPause();
        //銷燬在onResume()方法中的廣播
        unregisterReceiver(mBroadcastReceiver);
    }
}

注意:在onResume()註冊、onPause()註銷是因爲onPause()在App死亡前一定會被執行,從而保證廣播在App死亡前一定會被註銷,從而防止內存泄露。

靜態註冊和動態註冊廣播的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章