【轉】 Pro Android學習筆記(九七):BroadcastReceiver(1):基礎小例子

目錄(?)[-]node

  1. 基礎小例子
  2. 發送Broadcast intent
  3. 運行狀況
  4. 應用間的廣播

文章轉載只能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處:http://blog.csdn.net/flowingflying/android

和activity、content provider以及service同樣,BraodcastReceiver是Android的組件。廣播接收器接收廣播消息,並進行相應地處理。廣播消息就是Android的broadcast intent。一個broadcast intent能夠觸發多個接收器。app

基礎小例子

小例子很簡單,經過菜單觸發發送Broadcast,而後經過Logcat觀察接收器狀況。ide

發送Broadcast intent

private void sendBroadcast(){ 
    //爲了保證action的惟一性,一般採用包名的namespace。 
    String actionString = "cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc";
    Intent bcIntent = new Intent(actionString); 
    bcIntent.putExtra("message", "No " + (count ++)); 
    Log.v("Main","Before send"); 
    //組件(acivity或者service)使用sendBrocast()進行發送廣播消息,參數則是intent。
    sendBroadcast(bcIntent); 
    Log.v("Main","After send"); 
函數

Broadcast接收器學習

接收器實現很簡單,繼承BroadcastReceiver,同時要在manifest文件中經過<receiver>的tag來註冊要監聽的廣播intent,咱們也能夠在運行時在代碼中進行註冊。this

public class TestReceiver extends BroadcastReceiver{ 
    private String tag = "TestReceiver"; 
    @Override //收到廣播的回調函數
    public void onReceive(Context context, Intent intent) { 
        Utils.logThreadSignature(tag); //顯示Thread的信息
        Log.v(tag,"context = " + context); 
        Log.v(tag,"this = " + this); 
        Log.v(tag,"intent = " + intent); 
        String message = intent.getStringExtra("message"); 
        Log.v(tag,"message : " + message); 
    } 
}spa

須要經過AndroidManifest.xml告訴系統須要接受broadcast消息。<receiver>和其餘組件同樣是<application>的node。.net

<receiver android:name=".TestReceiver"> 
    <intent-filter > 
        <action android:name="cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc" />
    </intent-filter> 
</receiver>線程

運行狀況

咱們看看運行的接口,接收器運行在主線程中。

廣播是能夠被多個接收器接收的,咱們copyTestReceiver的代碼建立另外一個接收器TestReceiver2,以下,並在AndroidManifest.xml中進行註冊:

public class TestReceiver2 extends BroadcastReceiver{ 
    private String tag = "TestReceiver2"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
        Utils.logThreadSignature(tag); //顯示Thread的信息
        Log.v(tag,"context = " + context); 
        Log.v(tag,"this = " + this); 
        Log.v(tag,"intent = " + intent); 
        String message = intent.getStringExtra("message"); 
        Log.v(tag,"message : " + message); 
    } 
}

運行結果以下。當發出廣播時,全部註冊的接收器都會收到。因爲這兩個接收器的onReceive()都運行在主線程,即同一個線程中,他們是順序處理,而不是另行處理。能夠猜想廣播是放在消息隊列中,處理時依次觸發各接收器。咱們能夠將TestReceiver的處理時間增長,例如sleep()上幾秒,依次處理會更明顯。處理的順序和Manifest中的登記順序一致。

應用間的廣播

同一應用和不一樣應用均可以經過Manifest註冊對同一廣播的監聽,在代碼上區別,分別觸發運行在各自的主線程的回調函數。

小例子代碼在:Pro Android學習:Broadcast小例子

相關連接: 個人Android開發相關文章

相關文章
相關標籤/搜索