Android學習之四大元件(四)——BroadcastReceiver

紫霧凌寒發表於2015-10-15

1.系統廣播

BroadcastReceiver是一種負責接收廣播訊息並對訊息做出響應的元件,它和Service一樣,並不提供與使用者互動的UI介面。

在Android系統中存在許多標準的廣播動作,其中常見的有以下一些:

(1)Intent.ACTION_CAMERA_BUTTON; //按下拍照按鍵

(2)Intent.ACTION_DATA_CHANGED; //裝置日期發生改變

(3)Intent.ACTION_TIME_CHANGED;   //設定時間發生改變

(4)Intent.ACTION_TIMEZONE_CHANGED; //時區發生改變

(5)Intent.ACTION_BOOT_COMPLETED; //系統啟動完成

(6)Intent.ACTION_PACKAGE_ADDED; //成功安裝APK

(7)Intent.ACTION_PACKAGE_CHANGED; //已安裝的APK被改變

(8)Intent.ACTION_PACKAGE_REMOVED; //刪除APK

(9)Intent.ACTION_PACKAGE_DATA_CLEARED;     //清除應用程式的資料

(10)Intent.ACTION_BATIERY_LOW;   //電池電量低

(11)Intent.ACTION_BATIERY_CHANGED; //充電狀態電池電量發生變化

(12)Intent.ACTION_POWER_CONNECTED; //連線外部電源

(13)Intent.ACTION_POWER_DISCONNECTED;     //斷開外部電源

(14)Intent.ACTION_HEADSET_PLUG;      //插入耳機

(15)Intent.ACTION_INPUT_METHOD_CHANGED; //輸入法改變

(16)Intent.ACTION_MEDIA_CHECKING; //插入外部儲存裝置進行檢測

(17)Intent.ACTION_MEDIA_MOUNTED;   //外部儲存裝置Mount成功

(18)Intent.ACTION_MEDIA_REMOVED;   //外部儲存裝置移除

(19)Intent.ACTION_SCREEN_OFF;    //螢幕關閉

(20)Intent.ACTION_SCREEN_ON;     //螢幕開啟

(21)Intent.ACTION_SHUTDOWN;   //關閉系統

以上這些都是Android系統中內建的一些廣播動作,我們可以直接在我們的應用程式中接收這些廣播動作,並根據所接收到的不同廣播做出相應的處理。

 

2.釋出廣播

除了以上介紹的這些Android系統內建的廣播之外,如果我們想要在自己的應用程式中建立併釋出一個自定義的廣播也是很容易的。

廣播的內容和用於過濾廣播的動作是攜帶在Intent物件中被髮送出去的,所以我們可以通過Intent類提供的putExtra()方法向Intent物件中加入廣播內容,通過Intent類提供的setAction()方法向Intent物件中加入過濾廣播的動作。具體實現方法如下程式碼所示:

 1     /*
 2      * Function  :    點選事件處理
 3      * Author    :    部落格園-依舊淡然
 4      */
 5     public void onClick(View view) {
 6         switch(view.getId()) {
 7         case R.id.button:
 8             Intent intent = new Intent();               //建立Intent物件
 9             intent.setAction(MY_ACTION);               //設定Intent物件的Action屬性
10             intent.putExtra("key_msg", mEditText.getText().toString());    //向Intent物件中新增廣播內容
11             sendBroadcast(intent);                      //傳送廣播
12             break;
13         }
14     }

在以上的程式碼中,我們通過setAction()方法向Intent物件中加入了過濾廣播的動作,這個動作是我們自定義的,像Android中內建的廣播動作一樣,這個動作可以用來唯一的識別我們自定義的廣播。這裡我將該動作定義如下:

  private static final String MY_ACTION = "com.example.android_broadcast.msg";

此外,我們通過putExtra()方法向Intent物件中加入了廣播的內容,其中廣播的內容是EditText控制元件中的輸入內容。putExtra()方法提供了以鍵值對的形式儲存資料。

最後,我們通過sendBroadcast()方法,將攜帶有廣播資訊的Intent物件傳送出去即可。

需要注意的一點是,在Context類中提供了3種方式傳送廣播,分別是:

(1)Context.sendBroadcast();

(2)Context.sendStickyBroadcast();

(3)Context.sendOrderedBroadcast();

其中,使用sendBroadcast()方式傳送出去的Intent,所有滿足條件的BroadcastReceiver都會執行其onReceive()方法,但是如果有多個滿足條件的BroadcastReceiver,那麼其執行onReceive()方法的順序則是不一定的。

使用sendStickyBroadcast()方式傳送出去的Intent會一直存在,並且在以後如果呼叫registerReceive()方法註冊一個滿足條件的BroadcastReceiver時,Intent物件會直接返回給新註冊的BroadcastReceiver。

使用sendOrderedBroadcast()方式傳送出去的Intent,會根據BroadcastReceiver註冊時IntentFilter設定的優先順序的順序來執行onReceive()方法,但是相同優先順序的BroadcastReceiver執行onReceive()方法的順序是不一定的。

3.接收廣播

如果在我們的應用程式中需要接收某個廣播(Android內建的廣播或我們自定義的廣播),並對接收到的廣播進行相應的處理,那麼我們需要建立一個BroadcastReceiver類(繼承自android.Content.BroadcastReceiver類),並實現BroadcastReceiver類的onReceive()方法。BroadcastReceiver類中的onReceive()方法在接收到發給自己的廣播時會被呼叫。

除此之外,我們還需要對我們建立的BroadcastReceiver類進行註冊,註冊的方式有兩種:一種是在AndroidManifest.xml檔案中註冊BroadcastReceiver,另一種是直接在程式碼中通過registerReceive()方法註冊BroadcastReceiver。

下面就分別說說這兩種方式都是如何實現的。

3.1在AndroidManifest.xml檔案中註冊BroadcastReceiver

首先,我們需要建立一個BroadcastReceiver類,用來接收並處理剛才釋出的廣播資訊,具體如下程式碼所示:

 1   /*
 2    * Class     :  BroadcastReceiver類,用於接收並處理廣播資訊
 3    * Author    :  部落格園-依舊淡然
 4    */
 5   public class MyBroadcastReceiver extends BroadcastReceiver {
 6   
 7       @Override
 8       public void onReceive(Context context, Intent intent) {
 9           String msg = intent.getStringExtra("key_msg");            //獲取廣播的內容
10           Toast.makeText(context, "接收到的廣播資訊為:" + msg, Toast.LENGTH_LONG).show();
11       }
12   
13   }

通過以上的程式碼,我們建立了一個名為“MyBroadcastReceiver”的BroadcastReceiver 類,在onReceive()方法中取出了廣播的內容,並將其顯示出來。

完成了MyBroadcastReceiver的程式碼編寫之後,還需要在AndroidManifest.xml檔案中註冊該元件。具體方法如下所示:

1     <receiver 
2         android:name=".MyBroadcastReceiver">
3         <intent-filter>
4             <action android:name="com.example.android_broadcast.msg"    />
5         </intent-filter>
6     </receiver>

<receiver></receiver>標籤巢狀在<application></application>標籤裡,其中,android:name=”.MyBroadcastReceiver”指定了所要註冊的BroadcastReceiver元件的名字。<intent-filter></intent-filter>標籤中的<action>標籤則用於指定該BroadcastReceiver元件的過濾規則。可以看到,該標籤中的android:name=”com.example.android_broadcast.msg”,正是我們之前定義的廣播動作。由此,便唯一的確定了MyBroadcastReceiver所要響應的是哪一個廣播動作。

3.2通過registerReceive()方法註冊BroadcastReceiver

在Activity中,我們也可以直接在onStart()方法中通過呼叫registerReceiver()方法註冊BroadcastReceiver,在onStop()方法中通過呼叫unregisterReceiver()方法解除對BroadcastReceiver的註冊,如下程式碼所示:

 1     /*
 2      * Function  :    onStart()方法
 3      * Author    :    部落格園-依舊淡然
 4      */
 5     protected void onStart() {
 6         super.onStart();
 7         IntentFilter intentFilter = new IntentFilter();
 8         intentFilter.addAction(MY_ACTION);                    //設定Action
 9         registerReceiver(myBroadcastReceiver, intentFilter);    //註冊BroadcastReceiver元件
10     }
11 
12     /*
13      * Function  :    onStop()方法
14      * Author    :    部落格園-依舊淡然
15      */
16     protected void onStop() {
17         unregisterReceiver(myBroadcastReceiver);        //解除註冊BroadcastReceiver元件
18         super.onStop();
19     }

需要注意的一點是,如果你是在Activity的onResume()方法中註冊BroadcastReceiver的,那麼就需要在Activity的onPause()方法中解除對BroadcastReceiver的註冊。

3.3註冊廣播的兩種方式的區別

在AndroidManifest.xml檔案中註冊的BroadcastReceiver,屬於常駐型廣播,即使應用程式關閉了,如果有廣播資訊來,所建立的BroadcastReceiver同樣能夠接收到。所以這是一種靜態註冊廣播的形式。

通過registerReceive()方法註冊的BroadcastReceiver,屬於非常駐型廣播,通常在Activity結束時就會呼叫unregisterReceiver()方法解除BroadcastReceiver。所以這是一種動態註冊廣播的形式。


相關文章