Android應用程式的四大組件分別是Activity、Service、BroadcastReceiver和ContentProvider。其中,Activity、Service和ContentProvider在之前的博文中都已經介紹過了,具體如下:
(1)Activity:《Android學習筆記38:Android四大組件之Activity》
(2)Service:《Android學習筆記39:Android四大組件之Service》
(3)ContentProvider:《Android學習筆記37:使用Content Providers方式共用資料》
本文將主要對BroadcastReceiver進行介紹。
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; //IME改變
(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。所以這是一種動態註冊廣播的形式。