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();
}
}
<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();
}