安卓開發之廣播接收器BroadcastReceiver

cxmscb發表於2016-07-18

一、廣播Broadcast

  1. 廣播事件處理屬於系統級的,可跨應用的事件處理。

  2. 一個應用可以註冊對應的廣播接收器BroadcastReceiver接收一個/多個廣播,也可以傳送廣播Broadcast

  3. 廣播事件機制是應用程式(程式)間通訊的一種手段。

  4. 在onReceive中進行耗時操作需要開啟分執行緒來處理,不要在onReceive中直接做耗時處理。

二、相關API

  1. Context

    • sendBroadcast(Intent intent);:傳送一般廣播
    • sendOrderedBroadcast(Intent intent);:傳送有序廣播
    • registerReceiver(receiver,intentFilter);:動態註冊廣播接收器
    • unRegisterReceiver(receiver);:解除廣播接收器
  2. BroadcastReceiver

    • onReceive(Context context , Intent intent):接收到廣播時的回撥。
      //可以從Intent中獲取廣播所帶的資料

    • abortBroadcast():中斷廣播的繼續傳播

    • boolean isOrderedBroadcast():判斷是否為有序廣播
  3. 常見的系統廣播http://blog.sina.com.cn/s/blog_7dbac1250101mt5h.html

    (接收某些廣播時,需要一定的許可權)

    (攔截某些廣播時,需要較高的優先順序priority來優先接收到廣播)

三、廣播接收器的兩種註冊方式

  1. 廣播接收器的兩種註冊方式:靜態註冊和動態註冊。不管註冊方式如何,都要寫一個廣播接收器的子類,並在onReceive中進行接收到相關廣播後的事務處理 。

  2. IntentFilter的action中說明監聽的廣播行為。

    public class MyReceiver extends BroadcastReceiver{
    
            public MyReceiver(){
                Log.e("TAG","MyReceive");
            }
    
            @Override
            public void onReceive(Context context,Intent intent){
    
                Log.e("TAG","onReceive");
            }
    
    
    }       
    
  3. 靜態註冊:在應用的AnroidManiFest中註冊。

    <receiver android:name="廣播接收器子類的全類名">
        <intent-filter android:priority="設定廣播接收器的優先順序(int值)">
            <action android:name="所要接聽的廣播的action"/> 
        <intent-filter>
    </receiver>
    

    動態註冊:使用Java在程式碼中進行註冊。

    //動態註冊:
    MyReceiver myReceiver = new MyReceiver();
    //建立過濾器
    IntentFilter filter = new IntentFilter("所要接聽的廣播的action");
    //註冊廣播
    registerReceiver(myReceiver,filter)
    
    //解除廣播接收器,一般在onDestory中呼叫
    this.unregisterReceiver(myReceiver);  
    
    
    //動態註冊的廣播接收器只能為建立它的Activity/Service工作。
    //當動態註冊的廣播接收器的宿主Activity/Service銷燬時,要解除該廣播接收器。否則會報錯。
    

    動態註冊 本地廣播接收器(只在應用內傳播的廣播):LocalBroadcastManager

     LocalBroadcastManager mLocalBroadcastManager;    
     MyReceiver myReceiver;
    
     mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);  
     myReceiver = new MyReceiver();
    
     //建立過濾器
    IntentFilter filter = new IntentFilter("所要接聽的廣播的action");
    //註冊廣播接收器
    mLocalBroadcastManager.registerReceiver(mReceiver, filter);     
    
    //解除廣播接收器,一般在onDestory中呼叫
    mLocalBroadcastManager.unregisterReceiver(mReceiver);  
    
  4. 動態註冊和靜態註冊的區別

    靜態註冊:

    • 註冊方法:配置檔案

    • 註冊時間:應用安裝成功/手機開機載入應用完成。註冊時不會建立廣播接收器物件,接收到廣播時才建立。物件執行完onReceive後等待垃圾回收。收到廣播後在建立新的物件。

    • 生命結束的時間:應用解除安裝/物件等待垃圾回收,建立新的物件。

    • 應用場景:需要監聽整個應用的整個生命過程/其他應用

    動態註冊:

    • 註冊方式:Java程式碼

    • 註冊的時間:執行registerReceiver(receiver,filter)後,註冊時就建立廣播接收器物件。 接收廣播時不會再建立物件。

    • 生命結束的時間:執行unRegisterReceiver(receiver)。(註冊廣播接收器的宿主銷燬後必須解除註冊,解除註冊後,物件等待被回收)

    • 應用場景:只服務於某個Activity/Service

四、一般廣播和有序廣播

  • sendBroadcast(Intent intent);:傳送一般廣播

  • sendOrderedBroadcast(Intent intent);:傳送有序廣播

  • boolean isOrderedBroadcast():判斷是否為有序廣播(一般廣播不可以中斷)

  • 區別兩種廣播:

    這裡寫圖片描述

  • 可以在靜態註冊/動態註冊中指定優先順序priority,在廣播接收器中呼叫abortBroadcast()來中斷廣播的繼續傳播。(priority最大值為2^31-1)


相關文章