BroadcastReceiver(廣播接收者)

BroadcastReceiver是Android系統的核心組件。java

廣播是一種通訊機制,廣播的發送方能夠發出廣播,而另外一端可使用接收者接收該廣播,接收到了之後決定相應的處理。app

發廣播可使用sendBroadcast(Intent intent)方法實現,該方法是由ContextWrapper定義的。ide

在發送廣播時,須要在Intent對象中配置Action屬性,相似於生活中的廣播的「頻道號」spa

廣播的接收須要自定義類繼承BroadcastReceiver來實現,該自定義類能夠是內部類。code

註冊廣播接收者能夠在程序代碼中進行註冊,調用registerReceiver(BroadcastReceiver recevier, IntentFilter filter)便可實現註冊,註冊時,參數IntentFilter中應該經過addAction()方法添加全部須要接收的廣播中Intent攜帶的Action屬性。xml

發送廣播:對象

Intent it = new Intent();
it.setAction("cn.tedu.player.intent.action.PREVIOUS");
sendBroadcast(it);

接收廣播:
排序

private class InnerBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if("cn.tedu.player.intent.action.PLAY".equals(action)) {
            // PLAY
            Log.d("media store", "PlayMusicService$InnerBroadcastReceiver.onReceive() -> PLAY");
        } else if("cn.tedu.player.intent.action.PREVIOUS".equals(action)) {
            // PREVIOUS
            Log.d("media store", "PlayMusicService$InnerBroadcastReceiver.onReceive() -> PREVIOUS");
        }
    }
}

發廣播:sendBroadcast(Intent intent)繼承

收廣播:繼承BroadcastReceiver並註冊,重寫onReceive(Context context, Intent intent)方法get

【廣播的類型】

1) 普通廣播:廣而播之,經過sendBroadcast()發送廣播

2) 有序廣播:傳話,經過sendOrderedBroadcast()發送廣播,在廣播傳遞的過程當中,任何一個接收者均可以調用abortBroadcast()方法以終止廣播的傳遞,而且能夠經過setResultXXX()系列方法封裝數據,後續的廣播接收者則能夠經過getResultXXX(0方法獲取數據。

【有序廣播的接收者們的優先級】

1. 有序廣播的接收者們能夠在匹配的IntentFilter中配置priority屬性,表示優先級,取值爲int類型的數值,數值越大,則優先級越高,就會更優先收到廣播,反之,數值越小,優先級越低,就更後收到廣播

2. 當priority屬性的值相同時,若是註冊方式不一樣,則動態註冊的廣播接收者優先級更高,靜態註冊的廣播接收者優先級更低

3. 當priority屬性的值相同時,而且註冊方式也相同時,按照註冊的前後順序來區分,即根據registerReceiver()方法的調用順序,或在AndroidManifest.xml文件中<receiver>節點的順序來排列,越靠前的優先級越高。若是不一樣的應用程序都使用靜態註冊的廣播接收者,且優先級相同時,按照應用程序的包名按照字典排序法排序。

【廣播註冊】

1) 動態註冊:在類中使用registerReceiver(BroadcastReceiver receiver, IntentFilter filter)註冊,並在類被銷燬以前使用unregisterReceiver(BroadcastReceiver receiver)取消註冊。

2) 靜態註冊:在AndroidManifest.xml文件中註冊。

【註冊方式的區別】

1) 之內部類形式存在的廣播接收者只能使用動態註冊,而通常的廣播接收者類可使用任何一種方式進行註冊

2) 動態註冊是臨時的,靜態註冊是常駐的。

eg:

註冊廣播託收者

// 註冊廣播接收者
receiver = new InnerBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_SHOW_PLAY);
filter.addAction(ACTION_SHOW_PAUSE);
registerReceiver(receiver, filter);
相關文章
相關標籤/搜索