BroadcastReceiver

一. 廣播發送
1. 發送者分爲兩種:
<1>. 系統廣播,只能由Android系統發出,action的定義以下:
ACTION_TIME_TICK    系統時間已經改變。該事件每分鐘被廣播一次,只能經過動態註冊BroadcastReceiver來響應。
ACTION_TIME_CHANGED    系統時間被設置
ACTION_TIMEZONE_CHANGED   系統時區被改變
ACTION_BOOT_COMPLETED     系統啓動完成
ACTION_PACKAGE_ADDED     新的應用程序被安裝
ACTION_PACKAGE_CHANGED   應用程序被改變
ACTION_PACKAGE_REMOVED   應用程序被卸載
ACTION_PACKAGE_RESTARTED   應用程序被從新啓動
ACTION_PACKAGE_DATA_CLEARED   應用程序數據被清空
ACTION_UID_REMOVED    用戶ID被刪除
ACTION_BATTERY_CHANGED   電量改變
ACTION_POWER_CONNECTED   外接電源被連通
ACTION_POWER_DISCONNECTED  外接電源被斷開
ACTION_SHUTDOWN      系統關閉android

<2>. 用戶自定義廣播
兩種類型:
普通廣播:徹底異步,能夠在同一時刻(邏輯上)被全部接收者接收到,消息傳遞的效率比較高,而且沒法中斷廣播的傳播。經過sendBroadcast(intent)來發送。
有序廣播:廣播接收者將按預先聲明的優先級依次接收Broadcast。在onReceiver()中,廣播不會傳播到下一個接收者,此時當前的廣播接收者能夠abortBroadcast()終止廣播繼續向下傳播,也能夠將intent中的數據進行修改設置,而後將其傳播到下一個廣播接收者。
經過sendOrderedBroadcast()來發送。異步

2. 發送方式:
把要發送的信息和用於過濾的信息(如Action、Category)裝入一個Intent對象,而後調用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法把Intent對象以廣播方式發送出去。ide

二. 廣播接收:
1. 接收廣播的兩種方式:
<1>.靜態註冊
廣播接收者就是一個常駐在系統中的全局監聽器,不管應用是否處於運行狀態,廣播接收者都是已常常駐在系統中了。
只要調用PackageManager將Receiver禁用就銷燬掉這個廣播接收者。
這種模式適合於這樣的場景:某事件發生 -> 通知Broadcast -> 啓動相關處理應用。
<receiver android:name=".BootBroadcastReceiver" >
    <intent-filter>
        <!-- 自定義action的命名規則通常建議爲:包名.intent.類名  -->
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>線程

接收器:對象

public class BootBroadcastReceiver extends BroadcastReceiver {
    String RECEIVED = "android.intent.action.BOOT_COMPLETED";// action 名稱
    public void onReceive(Context context, Intent intent) {
       if (intent.getAction().equals( RECEIVED )) {
       }
    }
}生命週期

<2>.動態註冊:
一般是在OnResume事件中經過registerReceiver進行註冊,在 OnPause等事件中經過unregisterReceiver反註冊,經過這種方式使其可以在運行期間保持對相關事件的關注。
若是應用退出後,沒有撤銷已經註冊的接收者應用應用將會報錯。
其模式能夠歸結爲:啓動應用 -> 監聽事件 -> 發生時進行處理。事件

// 定義Action
public static String RECEIVED_ACTION = "android.intent.action.MY_BROADCAST_ACTION";
// 定義接收器
private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) { 
 if (intent.getAction().equals( RECEIVED_ACTION )) {
        } 
    }
};
 
// 註冊接收器
protected void onResume(){
    super.onResume();
    IntentFilter intentFilter = new IntentFilter( RECEIVED_ACTION );
    registerReceiver( myBroadcastReceiver, intentFilter);
}
// 註銷接收器
protected void onPause(){
    super.onRause();
    unregisterReceiver( myBroadcastReceiver );
}get

// 發送廣播
Intent intent = new Intent();
intent.setAction(RECEIVED_ACTION);
sendBroadcast(intent);it

2. 接收回調方法:
一個BroadcastReceiver能夠處理多個廣播消息,具體作法爲在onReceive()方法調用Intent參數的getAction判斷傳進來的動做,便可進行不一樣的處理。
不要建立子線程處理業務,由於它的生命週期很短。正確的處理方法就是經過intent啓動Activity做爲響應,或者經過NotificationMananger提醒用戶,或者啓動Service等。io

3. 廣播接收的順序: 有序廣播:優先級高的先接收;同優先級的動靜態廣播接收器,動態優先於靜態。普通廣播:無視優先級,動態廣播接收器優先於靜態廣播接收器。

相關文章
相關標籤/搜索