天天看點

android 廣播

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;

繼續閱讀