android 廣播

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

相關文章
相關標籤/搜索