BroadCastReceiver 源碼位於: framework/base/core/java/android.content.BroadcastReceiver.java
廣播接收者( BroadcastReceiver )用於接收廣播 Intent ,廣播 Intent 的發送是通過調用Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 來實現的。通常壹個廣播 Intent 可以被訂閱了此Intent 的多個廣播接收者所接收。
廣播是壹種廣泛運用的在應用程序之間傳輸信息的機制 。而 BroadcastReceiver 是對發送出來的廣播進行過濾接收並響應的壹類組件;
來自普通應用程序,如壹個應用程序通知其他應用程序某些數據已經下載完畢。
BroadcastReceiver 自身並不實現圖形用戶界面,但是當它收到某個通知後, BroadcastReceiver 可以啟動Activity 作為響應,或者通過 NotificationMananger 提醒用戶,或者啟動 Service 等等。
BroadCastReceiver 的機制
1. 機制
在 Android 裏面有各種各樣的廣播,比如電池的使用狀態,電話的接收和短信的接收都會產生壹個廣播,應用程序開發者也可以監聽這些廣播並做出程序邏輯的處理。如圖:
2. 實現
用接收短信舉例:
第壹種方式 :
實現
public class MyBroadcastReceiver extends BroadcastReceiver {
// action 名稱
String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ;
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals( SMS_RECEIVED )) {
// 相關處理 : 地域變換、電量不足、來電來信;
}
}
}
系統註冊:在 AndroidManifest.xml 中註冊
< receiver android:name = ".MyBroadcastReceiver" >
< intent-filter android:priority = "1000" >
< action android:name = " android.provider.Telephony.SMS_RECEIVED" />
</ intent-filter >
</ receiver > 當然了需要權限 :
< uses-permission android:name = "android.permission.RECEIVE_SMS" />
< uses-permission android:name = "android.permission.SEND_SMS" />
第二種方式:
// 廣播接收者 - 廣播的接收
private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 相關處理,如收短信,監聽電量變化信息
}
};
代碼中註冊:
IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );
registerReceiver( mBatteryInfoReceiver , intentFilter);
3. 生命周期
描述了 Android 中廣播的生命周期,其次它並不像 Activity 壹樣復雜,運行原理很簡單如下圖:
生命周期只有十秒左右,如果在 onReceive() 內做超過十秒內的事情,就會報錯 。
每次廣播到來時 , 會重新創建 BroadcastReceiver 對象 , 並且調用 onReceive() 方法 , 執行完以後 , 該對象即被銷毀 . 當 onReceive() 方法在 10 秒內沒有執行完畢, Android 會認為該程序無響應 . 所以在
BroadcastReceiver 裏不能做壹些比較耗時的操作 , 否側會彈出 ANR(Application No
Response) 的對話框 . 。