BroadCast Receiver(廣播接收器)相似於事件處理的機制,只不過這種事件是系統級別的廣播事件。咱們既可使用Intent的sendBroadcast方法發送廣播事件,也能夠在程序中實現Broadcast Reciever來監聽和響應這些廣播事件包括系統自身產生的廣播事件,例如收到短信,電池充滿等。下面是本人在學習過程當中的概括和心得。android
1. 發送廣播事件
發送廣播事件能夠經過Intent的sendBroadcast方法,定義Intent對象的Action。一旦系統中廣播接收器定義的過濾器中容許接受該廣播,就可對所受到的廣播進行響應。代碼以下:ide
-
- Intent intent = new Intent();
-
- intent.setAction(MY_ACTION);
-
- sendBroadcast(intent);
|
2. 接受廣播消息
經過繼承於BroadcastReceiver的子類接受廣播消息。首先須要在AndroidManifest.xml文件中加入receive標籤,並加入Intent過濾器,聲明能夠接收的Intent。以下:
- <receiver android:name=".MyReciever">
- <intent-filter>
- <action android:name="ACTION"/>
- </intent-filter>
- </receiver>
|
對廣播消息的響應是經過複寫onRecieve()方法體來實現。在該方法中,處理的是系統廣播事件接收短信,在方法中,將短信讀取,並在提示消息中顯示出來。具體實現方法以下:
- public class SMSReceiver extends BroadcastReceiver
- {
-
- public void onReceive(Context context, Intent intent)
- {
- Bundle bundle = intent.getExtras();
- Object messages[] = (Object[]) bundle.get("pdus");
- SmsMessage smsMessage[] = new SmsMessage[messages.length];
- for (int n = 0; n < messages.length; n++)
- {
- smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
- }
-
- Toast toast = Toast.makeText(context, "短信內容: " + smsMessage[0].getMessageBody(), Toast.LENGTH_LONG);
-
-
-
- toast.show();
- }
- }
|
廣播接收器既能夠用於接收自定義的廣播消息,也能夠接收系統內部的廣播事件。經過修改AndroidManifest.xml中接收器標籤中的過濾器來實現。若是想要對系統接收到短信這個廣播事件進行響應,則須要進行以下配置:
- <receiver android:name=".MyReciever">
- <intent-filter>
- <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
- </intent-filter>
- </receiver>
- //記得加上接收短信的權限
- <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
|
3. 須要注意的問題學習
a. 一旦廣播接收器可以響應的事件出現,它就會被觸發而無論這個應用程序有沒有被啓動。可是對於一些須要對UI進行操做的響應來講,這種機制是不合適的,不須要在沒有UI的時候響應消息。系統中提供了另一種註冊廣播接收器的方法,能夠隨着應用程序的開啓和關閉自動開始和結束響應。代碼以下:this
-
- smsReceiver = new SMSReceiver();
-
- IntentFilter filter = new IntentFilter();
-
- filter.addAction(SMS_ACTION);
-
- TestBC2Activity.this.registerReceiver(smsReceiver, filter);
-
-
- //解除BroadcastReceiver對象的註冊
TestBC2Activity.this.unregisterReceiver(smsReceiver);
-
|
b. 須要區分Activity和Service接收消息與廣播接收器接收消息機制的不一樣。spa
首先,前者接受消息的機制,既能夠經過顯式的指明組件名稱傳遞,也能夠經過設置接受組件的過濾器來隱式的傳遞。後者只能經過設置過濾器的方法來接收事件;xml
其次,startActivity()(startService())對應一個Activity或者Service,能夠開啓一個活動或者服務。sendBroadcast()對應onRecieve(),它只能用於接收廣播事件;對象
再次,對於前者接受的系統事件,須要由用戶本身指定傳遞的類型(ACTION)。而後後者所接收的廣播事件,不只能夠接收自定義的廣播事件,也能夠由系統本身發出(BROADCAST),用戶僅僅定義接受器便可;繼承
另外,前者在應用程序啓動狀態才接受消息;然後者只要接收到廣播信息,就能夠作出相應(在代碼中註冊接收器除外)。事件