二、BroadcastReciver(廣播接收者)
1、簡述
BroadcastReciver位於android.content包下,主要用於對廣播消息(Intent)的過濾並響應的控件。
BroadcastReceiver 自身並不實現圖形用戶界面,但是當它收到某個廣播消息後,BroadcastReceiver可以啟動Activity作為響應,
或者啟動Service服務等等。
2、運行原理
當其他應用程序發出廣播消息之後,所有注冊了BroadcastReciver的應用程序將會檢測注冊時的(過濾器)IntentFilter是否與發出的廣播消息相匹配,
匹配則會調用BroadcastReciver的onReceive()方法進行處理。所以開發BroadcastReciver應用,主要是對onReceive()方法的實現
3、生命周期
生命周期不像Activity那麼復雜,一般生命周期是:啟動(被其他程序調用,接收到匹配的廣播)-->運行(執行onReceive()方法)-->結束(釋放資源)
每次廣播到來時,會重新創建BroadcastReceiver對象 ,並且調用onReceive()方法,執行完以後,該對象即被銷毀。當onReceive()方法在10秒內沒有執行完畢,
Android會認為該程序無響應。所以在BroadcastReceiver裡不能做一些比較耗時的操作,否側會彈出 ANR(Application NoResponse)的對話框。
4、廣播的類型
主要有以下兩種類型:
a、普通廣播
普通廣播對於多個接收者來說是完全異步的,通常每個接收者都無需等待即可以接收到廣播,接收者相互之間不會有影響。對於這種廣播,接收者無法終止廣播,即無 法阻止其他接收者的接收動作。
b、有序廣播
有序廣播比較特殊,它每次只發送到優先級較高的接收者那裡,然後由優先級高的接受者再傳播到優先級低的接收者那裡,優先級高的接收者有能力終止這個廣播
5、廣播的收發
a、發送廣播:構建Intent對象,可調用sendBroadcast(Intent)方法將廣播發出。另外還有sendOrderedBroadcast(),sendStickyBroadcast()等方法
b、接收廣播:通過定義一個繼承BroadcastReceiver類來實現,繼承該類後覆蓋其onReceiver方法,並在該方法中響應事件
6、廣播的注冊
創建完BroadcastReceiver之後,還不能夠使它進入工作狀態,我們需要為它注冊一個指定的廣播地址,否則無法接收廣播
一般有如下兩種注冊:
a、靜態注冊
1 <receiver android:name=".MyReceiver">
2 <intent-filter>
3 <action android:name="android.intent.action.MY_BROADCAST"/>
4 <category android:name="android.intent.category.DEFAULT" />
5 </intent-filter>
6 </receiver>
b、動態注冊
1 MyReceiver receiver = new MyReceiver();
2
3 IntentFilter filter = new IntentFilter();
4 filter.addAction("android.intent.action.MY_BROADCAST");
5
6 registerReceiver(receiver, filter);
兩種注冊方法的區別是靜態注冊是常駐內存的,應用關閉是也可以接收廣播,而動態注冊是根著程序的生命周期,所以當這個程序退出時如果沒有解除注冊,系統會報一個異常,提示我們是否忘記解除注冊。這時要加入解除注冊的代碼:
1 @Override
2 protected void onDestroy() {
3 super.onDestroy();
4 unregisterReceiver(receiver);
5 }
7、運行實例
寫個例子,運行程序時發送廣播,後台日志打印消息。
MyReceiver代碼:
復制代碼
1 public class MyReceiver extends BroadcastReceiver {
2
3 private static final String TAG = "MyReceiver";
4
5 @Override
6 public void onReceive(Context arg0, Intent intent) {
7 // TODO Auto-generated method stub
8 String msg = intent.getStringExtra("msg");
9 Log.i(TAG, msg);
10 }
11
12 }
復制代碼
Activity發送廣播代碼:
1 Intent intent = new Intent("android.intent.action.MY_BROADCAST");
2 intent.putExtra("msg", "Hello Receiver!");
3 sendBroadcast(intent);
直接用靜態注冊廣播。上述例子的廣播是我們自己寫的。Android提供許多豐富的原生廣播地址。常用如下:
開機啟動:<action android:name="android.intent.action.BOOT_COMPLETED"/>
網絡連接:<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
電量變化:<action android:name="android.intent.action.BATTERY_CHANGED"/>
時間改變:<action android:name="android.intent.action.DATE_CHANGED"/>
只要更改自定義Receiver就可以觸發一些相應事件。