Android學習——BroadcastReceiver(廣播接收者)
阿新 • • 發佈:2018-12-13
BroadcastReceiver
定義
中文意思“廣播接收者”,是一個全域性的監聽器,屬於Android四大元件之一。
使用場景
- 同一個App內部的同一組件內的訊息通訊(單個或者多個執行緒之間);
- 同一個App內部的不同元件之間的訊息通訊(單個程序);
- 同一個App具有多個程序的不同元件之間的訊息通訊;
- 不同App之間的元件之間訊息通訊;
- Android系統在特定的情況下與App之間的訊息通訊。
BroadcastReceiver的註冊
註冊方式分為兩種:靜態註冊、動態註冊。
1.靜態註冊
註冊方式:在AndroidManifest.xml裡通過<receive>
標籤宣告;
屬性說明:
<receiver android:enabled=["true" | "false"] // 此broadcastReceiver能否接收其他App的發出的廣播 // 預設值是由receiver中有無intent-filter決定的:如果有intent-filter,預設值為true,否則為false android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" // 繼承BroadcastReceiver子類的類名 android:name=".mBroadcastReceiver" // 具有相應許可權的廣播發送者傳送的廣播才能被此BroadcastReceiver所接收; android:permission="string" // BroadcastReceiver執行所處的程序 // 預設為app的程序,可以指定獨立的程序 // 注:Android四大基本元件都可以通過此屬性指定自己的獨立程序 android:process="string" > // 用於指定此廣播接收器將接收的廣播型別 // 本這裡給出的是用於接收網路狀態改變時發出的廣播 <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>
註冊示例:
<receiver
//此廣播接收者類是MyBroadcastReceiver
android:name=".MyBroadcastReceiver" >
//用於接收網路狀態改變時發出的廣播
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
當App首次啟動時,系統會自動例項化MyBroadcastReceiver類,並註冊到系統中。
2.動態註冊
註冊方式:在程式碼中呼叫Context.registerReceiver()
方法。
示例程式碼:
// 選擇在Activity生命週期方法中的onResume()中註冊
@Override
protected void onResume(){
super.onResume();
// 1. 例項化BroadcastReceiver子類 & IntentFilter
mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
// 2. 設定接收廣播的型別
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
// 3. 動態註冊:呼叫Context的registerReceiver()方法
registerReceiver(mBroadcastReceiver, intentFilter);
}
// 註冊廣播後,要在相應位置記得銷燬廣播,否則程式會出現報錯
// 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
// 當此Activity例項化時,會動態將MyBroadcastReceiver註冊到系統中
// 當此Activity銷燬時,動態註冊的MyBroadcastReceiver將不再接收到相應的廣播。
@Override
protected void onPause() {
super.onPause();
//銷燬在onResume()方法中的廣播
unregisterReceiver(mBroadcastReceiver);
}
}
總結
- 動態註冊廣播不是常駐型廣播,也就是說廣播跟隨Activity的生命週期。注意在Activity結束前,移除廣播接收器。靜態註冊是常駐型,也就是說當應用程式關閉後,如果有資訊廣播來,程式也會被系統呼叫自動執行;
- 當廣播為有序廣播時:優先順序高的先接收(不分靜態和動態)。同優先順序的廣播接收器,動態優先於靜態;
- 同優先順序的同類廣播接收器,靜態:先掃描的優先於後掃描的,動態:先註冊的優先於後註冊的;
- 當廣播為預設廣播時:無視優先順序,動態廣播接收器優先於靜態廣播接收器。同優先順序的同類廣播接收器,靜態:先掃描的優先於後掃描的,動態:先註冊的優先於後冊的。