Android:Broadcast廣播類型主要分為5類:
普通廣播(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())。
若發送廣播有相應權限,那麼廣播接收者也需要相應權限
2. 系統廣播(System Broadcast)
Android中内置了多個系統廣播:隻要涉及到手機的基本操作(如開機、網絡狀态變化、拍照等等),都會發出相應的廣播
每個廣播都有特定的Intent - Filter(包括具體的action),Android系統廣播action如下:
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即可,并不需要手動發送廣播,當系統有相關操作時會自動進行系統廣播
3. 有序廣播(Ordered Broadcast)
定義 :發送出去的廣播被廣播接收者按照先後順序接收
有序是針對廣播接收者而言的,廣播接受者接收廣播的順序規則(同時面向靜态和動态注冊的廣播接受者)
1 按照Priority屬性值從大-小排序;
2 Priority屬性相同者,動态注冊的廣播優先;
特點
接收廣播按順序接收
先接收的廣播接收者可以對廣播進行截斷,即後接收的廣播接收者不再接收到此廣播;
先接收的廣播接收者可以對廣播進行修改,那麼後接收的廣播接收者将接收到被修改後的廣播
具體使用 :有序廣播的使用過程與普通廣播非常類似,差異僅在于廣播的發送方式:
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;