一、什麼是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死亡前一定會被註銷,從而防止內存泄露。