《Android》『BroadcastReceiver』- 廣播接收器的基本用法
《Android Developers 參考文獻》
《繼承架構》
extends Object
java.lang.Object
↳ android.content.BroadcastReceiver
《簡單介紹》
BroadcastReceiver 又稱作『廣播接收器』,它是一種系統級的全範圍通知,而不是針對單一位置,這樣的好處是,我們不必明確指出需要回應這個廣播的位置,就可以驅動需要回應此廣播的事件,舉個簡單的例子,這就好比在學校裡,當訓導主任廣播尋找王小明時,訓導主任只需要告知要找的是幾年幾班的王小明(不用知道他在哪裡),儘管全校的同學都會聽到這則廣播,但會去訓導處報到的,就只有王小明,在 android 中,我們時常需要利用此一機制,讓程式能在任何時候,對於不同的廣播訊息做出正確的反饋。
《用法介紹》
要使用 BroadcastReceiver,首先我們必須註冊此 BroadcastReceiver 的 Action,因為 BroadcastReceiver 是透過 Intent 在傳遞的,我們利用 Intent 中的 Action 屬性,當作每個 BroadcastReceiver 的識別碼,這樣當我們接收到不同的廣播訊息時,只要判斷其intent 中的 Action 資訊,就可以知道此廣播所代表的意義。
➥ unregisterReceiver – 撤銷廣播接收器
註冊廣播接收器 – registerReceiver
要使用廣播功能,最一開始要做的就是註冊廣播接收器,也就是定義 Action,有兩種註冊方式,分為於 AndroidManifest.xml 中註冊(靜態註冊)以及於程式碼中註冊(動態註冊),程式碼如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="tw.android" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="myReceiver"> <intent-filter> <action android:name="tw.android.ACTION_01"/> <!--註冊廣播接收器--> </intent-filter> </receiver> </application> </manifest> |
於 AndroidManifest.xml 中註冊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
. . public class MainActivity extends Activity { private MyBroadcaseReceiver mMyReceiver; //自訂一個繼承 BroadcastReceiver 的類別 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); IntentFilter itFilter = new IntentFilter("tw.android.ACTION_01"); //Intent itFilter =new IntentFilter(); //itFilter.addAction("tw.android.ACTION_01"); 一樣用法 mMyReceiver = new MyBroadcaseReceiver(); registerReceiver(mMyReceiver, itFilter); //註冊廣播接收器 } . . . } |
於程式碼中註冊
利用上面兩種方式, 我們為 BroadcastReceiver 註冊了一個 “tw.android.ACTION_01” 的字串,這個字串是我們自行定義的,它就像是這個廣播接收器的識別碼,用來在系統上眾多廣播訊號中做識別。
撤銷廣播接收器 – unregisterReceiver
若是在註冊廣播接收器的時候,我們是採用動態註冊的方式,也就是在程式碼中使用 registerReceiver 方法註冊,那麼我們亦可以於程式碼中,使用 unregisterReceiver 來撤銷已註冊的廣播接收器,程式碼如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
. . public class MainActivity extends Activity { private MyBroadcaseReceiver mMyReceiver; //自訂一個繼承 BroadcastReceiver 的類別 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); . . . unregisterReceiver(mMyReceiver); //撤銷廣播接收器 } . . . } |
發送廣播、接收廣播 – sendBroadcast、onReceive
註冊好廣播接收器以後,我們就可以開始執行發送與接收廣播的動作,其中接收的部分,我們必須自己實作一個繼承自 BroadcastReceiver 的自定義類別,以下直接以程式碼片段說明註冊、撤銷、發送與接收廣播的功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
. . public class MainActivity extends Activity { private MyBroadcastReceiver mMyReceiver; //自訂一個繼承 BroadcastReceiver 的類別 private Button BtnRegReceiver, //註冊廣播 BtnUnregReceiver, //撤銷廣播 BtnSendBroadcast, //發送廣播 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); BtnRegReceiver = (Button)findViewById(R.id.btnRegReceiver); BtnUnregReceiver = (Button)findViewById(R.id.btnUnregReceiver); BtnSendBroadcast = (Button)findViewById(R.id.btnSendBroadcast); BtnRegReceiver.setOnClickListener(btnRegReceiverOnClickLis); BtnUnregReceiver.setOnClickListener(btnUnregReceiverOnClickLis); BtnSendBroadcast.setOnClickListener(btnSendBroadcastOnClickLis); } private Button.OnClickListener btnRegReceiverOnClickLis = new Button.OnClickListener() { public void onClick(View v) { IntentFilter itFilter = new IntentFilter("tw.android.ACTION_01"); //Intent itFilter =new IntentFilter(); //itFilter.addAction("tw.android.ACTION_01"); 一樣用法 mMyReceiver = new MyBroadcastReceiver(); registerReceiver(mMyReceiver, itFilter); //註冊廣播接收器 } }; private Button.OnClickListener btnUnregReceiverOnClickLis = new Button.OnClickListener() { public void onClick(View v) { unregisterReceiver(mMyReceiver); //撤銷廣播接收器 } }; private Button.OnClickListener btnSendBroadcastOnClickLis = new Button.OnClickListener() { public void onClick(View v) { Intent it = new Intent("tw.android.ACTION_01"); //設定廣播識別碼 it.putExtra("sender_name", "Xavier"); //設定廣播夾帶參數 sendBroadcast(it); //發送廣播訊息 } }; } |
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 |
package ... import ... public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String name = intent.getStringExtra("sender_name"); } } |
MyBroadcastReceiver.java
在以上程式碼中,我們宣告了三個按鈕,分別用來執行註冊、撤銷以及發送廣播的動作,並宣告了一個繼承自 BroadcastReceiver 的自定義類別 MyBroadcastReceiver,在裡面的 onReceive 方法處理接收到相應廣播識別碼時所要執行的動作,我們亦可以於 intent 中透過 putExtra 的方式夾帶參數進來。
臉書留言
一般留言