Android:Broadcast廣播類型主要分爲5類:android
普通廣播(Normal Broadcast)
系統廣播(System Broadcast)
有序廣播(Ordered Broadcast)
粘性廣播(Sticky Broadcast)
應用內廣播(Local Broadcast)
具體說明以下:安全
1. 普通廣播(Normal Broadcast)
即開發者自身定義intent的廣播(最經常使用)。網絡
發送廣播使用以下:
1 Intent intent = new Intent(); 2 //對應BroadcastReceiver中intentFilter的action 3 intent.setAction(BROADCAST_ACTION); 4 //發送廣播 5 sendBroadcast(intent);
以下mBroadcastReceiver則會接收上述廣播
//此廣播接收者類是mBroadcastReceiver//用於接收網絡狀態改變時發出的廣播
<receiver android:name=".mBroadcastReceiver" >
<intent-filter>
<action android:name="BROADCAST_ACTION" />
</intent-filter>
</receiver>
若被註冊了的廣播接收者中註冊時intentFilter的action與上述匹配,則會接收此廣播(即進行回調onReceive())。this
若發送廣播有相應權限,那麼廣播接收者也須要相應權限
2. 系統廣播(System Broadcast)
Android中內置了多個系統廣播:只要涉及到手機的基本操做(如開機、網絡狀態變化、拍照等等),都會發出相應的廣播
每一個廣播都有特定的Intent - Filter(包括具體的action),Android系統廣播action以下:spa
1 系統操做 action 2 監聽網絡變化 android.net.conn.CONNECTIVITY_CHANGE 3 關閉或打開飛行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED 4 充電時或電量發生變化 Intent.ACTION_BATTERY_CHANGED 5 電池電量低 Intent.ACTION_BATTERY_LOW 6 電池電量充足(即從電量低變化到飽滿時會發出廣播 Intent.ACTION_BATTERY_OKAY 7 系統啓動完成後(僅廣播一次) Intent.ACTION_BOOT_COMPLETED 8 按下照相時的拍照按鍵(硬件按鍵)時 Intent.ACTION_CAMERA_BUTTON 9 屏幕鎖屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS 10 設備當前設置被改變時(界面語言、設備方向等) Intent.ACTION_CONFIGURATION_CHANGED 11 插入耳機時 Intent.ACTION_HEADSET_PLUG 12 未正確移除SD卡但已取出來時(正確移除方法:設置–SD卡和設備內存–卸載SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL 13 插入外部儲存裝置(如SD卡) Intent.ACTION_MEDIA_CHECKING 14 成功安裝APK Intent.ACTION_PACKAGE_ADDED 15 成功刪除APK Intent.ACTION_PACKAGE_REMOVED 16 重啓設備 Intent.ACTION_REBOOT 17 屏幕被關閉 Intent.ACTION_SCREEN_OFF 18 屏幕被打開 Intent.ACTION_SCREEN_ON 19 關閉系統時 Intent.ACTION_SHUTDOWN 20 重啓設備 Intent.ACTION_REBOOT
注:當使用系統廣播時,只須要在註冊廣播接收者時定義相關的action便可,並不須要手動發送廣播,當系統有相關操做時會自動進行系統廣播.net
3. 有序廣播(Ordered Broadcast)
定義 :發送出去的廣播被廣播接收者按照前後順序接收code
有序是針對廣播接收者而言的,廣播接受者接收廣播的順序規則(同時面向靜態和動態註冊的廣播接受者)orm
1 按照Priority屬性值從大-小排序; 2 Priority屬性相同者,動態註冊的廣播優先;
特色blog
接收廣播按順序接收
先接收的廣播接收者能夠對廣播進行截斷,即後接收的廣播接收者再也不接收到此廣播;
先接收的廣播接收者能夠對廣播進行修改,那麼後接收的廣播接收者將接收到被修改後的廣播
具體使用 :有序廣播的使用過程與普通廣播很是相似,差別僅在於廣播的發送方式:排序
sendOrderedBroadcast(intent);
4. App應用內廣播(Local Broadcast)
背景 :Android中的廣播能夠跨App直接通訊(exported對於有intent-filter狀況下默認值爲true)
衝突 :
可能出現的問題:
其餘App針對性發出與當前App intent-filter相匹配的廣播,由此致使當前App不斷接收廣播並處理;
其餘App註冊與當前App一致的intent-filter用於接收廣播,獲取廣播具體信息;
即會出現安全性 & 效率性的問題。
解決方案 :使用App應用內廣播(Local Broadcast)。
App應用內廣播可理解爲一種局部廣播,廣播的發送者和接收者都同屬於一個App。
相比於全局廣播(普通廣播),App應用內廣播優點體如今:安全性高 & 效率高
具體使用1 - 將全局廣播設置成局部廣播
註冊廣播時將exported屬性設置爲 false,使得非本App內部發出的此廣播不被接收;
在廣播發送和接收時,增設相應權限permission,用於權限驗證;
發送廣播時指定該廣播接收器所在的包名,此廣播將只會發送到此包中的App內與之相匹配的有效廣播接收器中。
經過intent.setPackage(packageName)指定報名
具體使用2 - 使用封裝好的LocalBroadcastManager類
使用方式上與全局廣播幾乎相同,只是註冊/取消註冊廣播接收器和發送廣播時將參數的context變成了LocalBroadcastManager的單一實例
注:對於LocalBroadcastManager方式發送的應用內廣播,只能經過LocalBroadcastManager動態註冊,不能靜態註冊
1 //註冊應用內廣播接收器 2 //步驟1:實例化BroadcastReceiver子類 & IntentFilter mBroadcastReceiver 3 mBroadcastReceiver = new mBroadcastReceiver(); 4 IntentFilter intentFilter = new IntentFilter(); 5 6 //步驟2:實例化LocalBroadcastManager的實例 7 localBroadcastManager = LocalBroadcastManager.getInstance(this); 8 9 //步驟3:設置接收廣播的類型 10 intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE); 11 12 //步驟4:調用LocalBroadcastManager單一實例的registerReceiver()方法進行動態註冊 13 localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter); 14 15 //取消註冊應用內廣播接收器 16 localBroadcastManager.unregisterReceiver(mBroadcastReceiver); 17 18 //發送應用內廣播 19 Intent intent = new Intent(); 20 intent.setAction(BROADCAST_ACTION); 21 localBroadcastManager.sendBroadcast(intent);
5. 粘性廣播(Sticky Broadcast)
因爲在Android5.0 & API 21中已經失效,因此不建議使用,在這裏也不做過多的總結。
6. 特別注意
對於不一樣註冊方式的廣播接收器回調OnReceive(Context context,Intent intent)中的context返回值是不同的:
對於靜態註冊(全局+應用內廣播),回調onReceive(context, intent)中的context返回值是:ReceiverRestrictedContext;
對於全局廣播的動態註冊,回調onReceive(context, intent)中的context返回值是: Activity Context;
對於應用內廣播的動態註冊(LocalBroadcastManager方式),回調onReceive(context, intent)中的context返回值是: Application Context。
對於應用內廣播的動態註冊(非LocalBroadcastManager方式),回調onReceive(context, intent)中的context返回值是:Activity Context;