Broadcast組件

     BroadCast Receiver(廣播接收器)類似於事件處理的機制,只不過這種事件是系統級別的廣播事件。我們既可以使用Intent的sendBroadcast方法發送廣播事件,也可以在程序中實現Broadcast Reciever來監聽和響應這些廣播事件包括系統自身產生的廣播事件,例如收到短信,電池充滿等。下面是本人在學習過程中的歸納和心得。


1. 發送廣播事件
    發送廣播事件可以通過Intent的sendBroadcast方法,定義Intent對象的Action。一旦系統中廣播接收器定義的過濾器中允許接受該廣播,就可對所受到的廣播進行響應。代碼如下:

 
 

  1. // 實例化Intent對象  
  2.                 Intent intent = new Intent();  
  3.                 // 設置Intent action屬性,Action屬性需要和接收器中允許的屬性一致  
  4.                 intent.setAction(MY_ACTION);  
  5.                 // 發出廣播  
  6.                 sendBroadcast(intent);  


2. 接受廣播消息
    通過繼承於BroadcastReceiver的子類接受廣播消息。首先需要在AndroidManifest.xml文件中加入receive標籤,並加入Intent過濾器,聲明可以接收的Intent。如下:

 
 

  1. <receiver android:name=".MyReciever"> 
  2.            <intent-filter> 
  3.                <action android:name="ACTION"/> 
  4.            </intent-filter> 
  5.         </receiver> 


    對廣播消息的響應是通過複寫onRecieve()方法體來實現。在該方法中,處理的是系統廣播事件接收短信,在方法中,將短信讀取,並在提示消息中顯示出來。具體實現方法如下:

 

  1. public class SMSReceiver extends BroadcastReceiver 
  2.     /*當收到短信時,就會觸發此方法*/ 
  3.     public void onReceive(Context context, Intent intent) 
  4.     { 
  5.         Bundle bundle = intent.getExtras(); 
  6.         Object messages[] = (Object[]) bundle.get("pdus"); 
  7.         SmsMessage smsMessage[] = new SmsMessage[messages.length]; 
  8.         for (int n = 0; n < messages.length; n++) 
  9.         { 
  10.             smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
  11.         } 
  12.         //產生一個Toast 
  13.         Toast toast = Toast.makeText(context, "短信內容: " + smsMessage[0].getMessageBody(), Toast.LENGTH_LONG); 
  14.         //設置toast顯示的位置 
  15.         //toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 200); 
  16.         //顯示該Toast 
  17.         toast.show(); 
  18.     } 

    廣播接收器既可以用於接收自定義的廣播消息,也可以接收系統內部的廣播事件。通過修改AndroidManifest.xml中接收器標籤中的過濾器來實現。如果想要對系統接收到短信這個廣播事件進行響應,則需要進行如下配置:

 
 

  1. <receiver android:name=".MyReciever">  
  2.            <intent-filter>  
  3.                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
  4.            </intent-filter>  
  5.         </receiver> 
  6. //記得加上接收短信的權限
  7. <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

 

3. 需要注意的問題

    a. 一旦廣播接收器能夠響應的事件出現,它就會被觸發而不管這個應用程序有沒有被啓動。但是對於一些需要對UI進行操作的響應來說,這種機制是不合適的,不需要在沒有UI的時候響應消息。系統中提供了另外一種註冊廣播接收器的方法,可以隨着應用程序的開啓和關閉自動開始和結束響應。代碼如下:

 
 

  1. //生成一個BroiadcastReceiver對象  
  2.             smsReceiver = new SMSReceiver();  
  3.             //生成一個IntentFilter對象  
  4.             IntentFilter filter = new IntentFilter();  
  5.             //爲IntentFilter添加一個Action  
  6.             filter.addAction(SMS_ACTION);  
  7.             //將BroadcastReceiver對象註冊到系統當中  
  8.             TestBC2Activity.this.registerReceiver(smsReceiver, filter);  
  9.  
  10.  
  11. //解除BroadcastReceiver對象的註冊
       TestBC2Activity.this.unregisterReceiver(smsReceiver);
  12.  

  b. 需要區分Activity和Service接收消息與廣播接收器接收消息機制的不同。

    首先,前者接受消息的機制,既可以通過顯式的指明組件名稱傳遞,也可以通過設置接受組件的過濾器來隱式的傳遞。後者只能通過設置過濾器的方法來接收事件;

    其次,startActivity()(startService())對應一個Activity或者Service,可以開啓一個活動或者服務。sendBroadcast()對應onRecieve(),它只能用於接收廣播事件;

     再次,對於前者接受的系統事件,需要由用戶自己指定傳遞的類型(ACTION)。然後後者所接收的廣播事件,不僅可以接收自定義的廣播事件,也可以由系統自己發出(BROADCAST),用戶僅僅定義接受器即可;

    另外,前者在應用程序啓動狀態才接受消息;而後者只要接收到廣播信息,就可以做出相應(在代碼中註冊接收器除外)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章