1. 程式人生 > >Android學習——BroadcastReceiver(廣播接收者)

Android學習——BroadcastReceiver(廣播接收者)

BroadcastReceiver

定義

中文意思“廣播接收者”,是一個全域性的監聽器,屬於Android四大元件之一。

使用場景

  1. 同一個App內部的同一組件內的訊息通訊(單個或者多個執行緒之間);
  2. 同一個App內部的不同元件之間的訊息通訊(單個程序);
  3. 同一個App具有多個程序的不同元件之間的訊息通訊;
  4. 不同App之間的元件之間訊息通訊;
  5. Android系統在特定的情況下與App之間的訊息通訊。

BroadcastReceiver的註冊

註冊方式分為兩種:靜態註冊、動態註冊。

1.靜態註冊

註冊方式:在AndroidManifest.xml裡通過<receive>標籤宣告; 屬性說明:

<receiver 
    android:enabled=["true" | "false"]
	// 此broadcastReceiver能否接收其他App的發出的廣播
	// 預設值是由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 
    //此廣播接收者類是MyBroadcastReceiver
    android:name=".MyBroadcastReceiver" >
    //用於接收網路狀態改變時發出的廣播
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

當App首次啟動時,系統會自動例項化MyBroadcastReceiver類,並註冊到系統中。

2.動態註冊

註冊方式:在程式碼中呼叫Context.registerReceiver()方法。 示例程式碼:

//  選擇在Activity生命週期方法中的onResume()中註冊
@Override
  protected void onResume(){
      super.onResume();

    //  1. 例項化BroadcastReceiver子類 &  IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    //  2. 設定接收廣播的型別
    intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    //  3. 動態註冊:呼叫Context的registerReceiver()方法
     registerReceiver(mBroadcastReceiver, intentFilter);
 }


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

總結

  1. 動態註冊廣播不是常駐型廣播,也就是說廣播跟隨Activity的生命週期。注意在Activity結束前,移除廣播接收器。靜態註冊是常駐型,也就是說當應用程式關閉後,如果有資訊廣播來,程式也會被系統呼叫自動執行;
  2. 當廣播為有序廣播時:優先順序高的先接收(不分靜態和動態)。同優先順序的廣播接收器,動態優先於靜態;
  3. 同優先順序的同類廣播接收器,靜態:先掃描的優先於後掃描的,動態:先註冊的優先於後註冊的;
  4. 當廣播為預設廣播時:無視優先順序,動態廣播接收器優先於靜態廣播接收器。同優先順序的同類廣播接收器,靜態:先掃描的優先於後掃描的,動態:先註冊的優先於後冊的。