android學習日記19–四大組件之BroadcastReciver(廣播接收者)

二、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();

3 IntentFilter filter = new IntentFilter();

4 filter.addAction("android.intent.action.MY_BROADCAST");

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就可以觸發一些相應事件。

發佈留言