BroadcastReceiver 詳解

一、定義

BroadcastReceiver,廣播接收器,是四大組件之一。是全局(一般情況下,應用內廣播可認爲是局
部廣播,將exported屬性設置爲false)的監聽器,Android 廣播分爲兩個角色:廣播發送者和廣
播接收者。

二、應用場景

a.不同組件之間的通信(包括應用內和應用之間)

b.與Android系統在特定情況下的通信

c.線程之間的通信

三、生命週期

當一個broadcast信息到達該receiver,Android調用它的onReceive()方法並將含有該廣播信息

的intent 對象傳遞它。Broadcast receiver僅僅在執行該方法時才被認爲是活躍的。當

onReceive()返回後,它又處於非活躍狀態。也就是說,它的生命週期爲從回調onReceive()方

法開始到該方法返回結果後結束。最長只有10秒,所以我們不能再OnReceive()中做耗時的任

務,可以將耗時的任務轉移到服務中進行。

四、實現原理

Android 中的廣播使用了設計模式中的觀察者模式,基於消息的發佈/訂閱事件模型。

五、廣播的兩種註冊方式:靜態註冊和動態註冊

  • 靜態註冊

是在配置文件AndroidManifest.xml裏通過**標籤聲明receiver 標籤聲明

屬性值說明

<receiver 
//這個屬性用於定義系統是否能夠實例化這個廣播接收器,如果設置爲true,則能夠實例化,如果設置爲false,則不能被實例化。默認值是true。
    android:enabled=["true" | "false"]
//這個屬性用於指示該廣播接收器是否能夠接收來自應用程序外部的消息,如果設置true,則能夠接收,如果設置爲false,則不能夠接收。如果
//設置爲false,這該接收只能接收那些由相同應用程序組件或帶有相同用戶ID的應用程序所發出的消息。
//默認值是由receiver中有無intent-filter決定的:如果有intent-filter,默認值爲true,否則爲false
    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
//繼承BroadcastReceiver子類的類名
    android:name=".mBroadcastReceiver"
//具有相應權限的廣播發送者發送的廣播才能被此BroadcastReceiver所接收;
    android:permission="string"
//BroadcastReceiver運行所處的進程
//默認爲app的進程,可以指定獨立的進程
//注:Android四大基本組件都可以通過此屬性指定自己的獨立進程
    android:process="string" >

//用於指定此廣播接收器將接收的廣播類型
//本示例中給出的是用於接收網絡狀態改變時發出的廣播
 <intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>


註冊示例

<receiver 
  //此廣播接收者類是mBroadcastReceiver
  android:name=".mBroadcastReceiver" >
  //用於接收網絡狀態改變時發出的廣播
  <intent-filter>
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  </intent-filter>
</receiver>

當此App首次啓動時,系統會自動實例化mBroadcastReceiver類,並註冊到系統中。
  • 動態註冊

在代碼中通過調用Context的registerReceiver()方法進行動態註冊BroadcastReceiver,

具體代碼如下:

@Override
  protected void onResume(){
      super.onResume();

    //實例化BroadcastReceiver子類 &  IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    //設置接收廣播的類型
     intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    //調用Context的registerReceiver()方法進行動態註冊
     registerReceiver(mBroadcastReceiver, intentFilter);
 }


//註冊廣播後,要在相應位置記得銷燬廣播
//即在onPause() 中unregisterReceiver(mBroadcastReceiver)
//當此Activity實例化時,會動態將MyBroadcastReceiver註冊到系統中
//當此Activity銷燬時,動態註冊的MyBroadcastReceiver將不再接收到相應的廣播。
 @Override
 protected void onPause() {
     super.onPause();
      //銷燬在onResume()方法中的廣播
     unregisterReceiver(mBroadcastReceiver);
     }
}

注意:動態註冊的廣播,在它依附的上下文銷燬之前註銷廣播註冊,否則會導致內存泄露。

  • 靜態註冊和動態註冊的區別

靜態註冊:常駐型廣播;不受到任何組件的生命週期影響;應用場景是需要時刻監聽的廣播;

動態註冊:非常駐型廣播;跟隨註冊它的組件的生命週期,使用靈活,在組件生命週期結束前

必須註銷廣播;應用場景是在特定時刻需要監聽的廣播。

六、廣播的類型

*普通廣播
*有序廣播
*粘性廣播
*系統廣播
*App應用內廣播

注意:

1.粘性廣播在Android5.0已經廢棄,不建議再使用該廣播。

2.可以在onReceive()中通過isOrderdBroadcast()方法判斷是否是有序廣播,該方法是

BroadcastReceiver類中提供的方法,返回boolean型值,用於判斷是否是有序廣播。

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