Android四大組件之BroadcastReceiver

Android四大組件之BroadcastReceiver

Broadcast Receiver
廣播接收器,是一種負責接收廣播消息並對消息做出響應的組件,和Service一樣並不提供與用戶交互的UI界面。它和事件處理機制類似,只不過事件處理機制是程序組件級別,而廣播事件是系統級別。

      系統源碼:frameworks/base/core/java/android.content.BroadcastReceiver.java


1)BroadcastReceiver生命週期 

       BroadcastReceiver對象僅在調用onReceive()方法時有效,當該方法調用完畢,系統將摧毀這個對象。當下次再次受到廣播的時候將再次new生成一個BroadcastReceiver對象。當onReceive()方法在大概10秒內沒有執行完畢,系統會認爲該程序無響應,所以在onReceive()方法如果需要做一些耗時的工作,我們可以通過發送Intet給其他Activity或Service來完成。


2)Android標準的廣播ACTION

ACTION_TIME_TICK	
ACTION_TIME_CHANGED	時間改變
ACTION_TIMEZONE_CHANGED
ACTION_BOOT_COMPLETED	系統啓動完畢
ACTION_PACKAGE_ADDED	添加apk包
ACTION_PACKAGE_CHANGED	apk包改變
ACTION_PACKAGE_REMOVED
ACTION_PACKAGE_RESTARTED
ACTION_PACKAGE_DATA_CLEARED
ACTION_UID_REMOVED
ACTION_BATTERY_CHANGED	電源改變
ACTION_POWER_CONNECTED	連接電源
ACTION_POWER_DISCONNECTED
ACTION_SHUTDOWN 	關機
ACTION_CAMERA_BUTTON	拍照
ACTION_MEDIA_MOUNTED

3)發佈廣播

        我們可以在應用程序中創建自定義的廣播事件。廣播的內容和用於過濾廣播的Action都通過Intent對象發送出去。

{
	protected static final String MY_ACTION="com.example.myBroadcast.ACTION"
	Intent intent = new Intent();
	intent.setAction(MY_ACTION);
	intent.putExtra("msg", "This is my a broadcast message");
	sendBroadCast(intent);
}
在上述代碼中我們通過setAction()方法向Intent對象中加入了過濾廣播的動作,這個動作是我們自定義的,像Android中內置的廣播動作一樣,這個動作可以用來唯一的識別我們自定義的廣播。

在Context中系統提供了三種發送廣播的方法:

(1) Context.sendBroadcast();
所有滿足條件的BroadcastReceiver都會執行其onReceive()方法

(2) Context.sendStickyBroadcast();
發送出去的Intent一直存在,而且如果以後系統中註冊的BroadcastReceiver滿足這個Action時會立即接收到這個廣播。

(3) Context.sendOrderedBroadcast();
發送出去的廣播會根據BroadcastReceiver註冊時IntentFilter設置的優先級的屬性來執行其onReceive()方法,相同優先級的BroadcastReceiver執行onReceive()方法的順序不確定。

4)Broadcast Receiver的註冊

如果我們希望在應用程序中能接受到某個廣播(Android系統內置的廣播或我們自己定義的廣播),並且對收到的廣播進行處理,那麼我們需要創建一個BroadcastReceiver類,在其onReceive()方法中對廣播進行處理。同時我們還需要對我們的BroadcastReceiver進行註冊(告訴系統自己的存在)。

註冊BroadcastReceiver的方法有兩種:

(1)在AndroidManifest.xml文件中註冊
在AndroidManifest.xml中註冊的廣播屬於常駐型廣播,即使應用程序關閉了,還能接收到廣播。

首先我們需要創建一個類,繼承自BroadcastReceiver並實現其onReceive()方法

public class MyBroadcastReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		String msg = intent.getStringExtra("msg");
		Toast.makeText(context, "接收到的廣播爲:"+msg, Toast.LENGTH_LONG).show();
	}
}


然後在AndroidManifest.xml中註冊:


<receiver android:name=".MyBroadcastReceiver">
	<intent-filter>
		<action android:name="com.example.myBroadcast.ACTION"/>
	</intent-filter>
</receiver>



(2)在應用程序的代碼中註冊
在代碼中使用registerReceiver()方法動態註冊的廣播屬於非常駐型廣播,當應用程序關閉後,我們調用了unregisterReceiver()解除了BroadcastReceiver,這種方法比較靈活。

在Activity中我們可以在onResume()方法中通過調用registerReceiver()方法註冊我們的BroadcastReceiver
然後在onStop()方法中調用unregisterReceiver()方法進行解註冊。

MyBroadcastReceiver myReceiver = null;
protected void onResume() {
	super.onResume();
	if(myReceiver == null ) {
		myReceiver = new MyBroadcastReceiver();
		IntentFilter filter = new InterFilter();
		filter.addAction(MY_ACTION);
		registerReceiver(myReceiver, filter);
	}
}

protected void onStop() {
	if( myReceiver != null ) {
		unregisterReceiver(myReceiver);
		myReceiver = null;
	}
	super.onStop();
}



發佈了44 篇原創文章 · 獲贊 12 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章