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