android 四大組件之BroadCastReceiver

  BroadCastReceiver是android四大組件之一,主要作用是,專注於接收廣播消息

1.實現一個BroadCastReceiver實現類,BroadCastReceiver是一個抽象類,也有一個抽象方法onReceive,重寫onReceive方法

這裏寫圖片描述

2.BroadCastReceiver註冊,有兩種方式,一種是靜態註冊(就是在AndroidManifest.xml 下的<\application>節點中註冊),另一種是動態註冊(代碼註冊)

  靜態註冊,就是在AndroidManifest.xml 下的<\application>節點中註冊如下圖

這裏寫圖片描述

  動態註冊,就是在代碼中註冊如下圖

這裏寫圖片描述

3.兩種註冊類型的區別:

  靜態註冊是當程序關閉後,如果有廣播發過來,還能啓動程序
  
  動態註冊的生命週期跟程序的生命週期是一樣的,程序關閉後動態註冊的廣播是不能在接收到廣播的

4.動態註冊和靜態註冊的優缺點

  靜態註冊
    優點:當程序退出後還能接收到廣播
    缺點:時時監聽,浪費內存
  
  動態註冊
    優點:當程序啓動後,纔去監聽,比靜態註冊省內存
        在Android的廣播機制中,動態註冊的優先級高於靜態註冊的優先級,因此在必要情況下,我們需要動態註冊廣播接收器
    缺點:當程序退出後,不能接收到廣播消息

5.生命週期

  當BroadCastReceiver接收到消息,會立即回調onReceive方法,並將包含消息的Intent對象傳給它。onReceive中代碼的執行時間不要超過5s,否則Android會彈出超時dialog。也不要執行異步任務,線程是不安全的。

6.廣播類型

  廣播的類型主要分爲5類:

    普通廣播(Normal Broadcast)
    系統廣播(System Broadcast)
    有序廣播(Ordered Broadcast)
    粘性廣播(Sticky Broadcast)
    App應用內廣播(Local Broadcast)

7.普通廣播(Normal Broadcast)
  
  一般指用戶自定義的廣播比如上面的廣播,就是普通廣播

8.系統廣播(System Broadcast)

  Android中內置了多個系統廣播:只要涉及到手機的基本操作(如開機、網絡狀態變化、拍照等等),都會發出相應的廣播。每個廣播都有特定的Intent - Filter(包括具體的action),Android系統廣播action如下:

系統操作 action
關閉或打開飛行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
充電時或電量發生變化 Intent.ACTION_BATTERY_CHANGED
電池電量低 Intent.ACTION_BATTERY_LOW
電池電量充足(即從電量低變化到飽滿時會發出廣播) Intent.ACTION_BATTERY_OKAY
系統啓動完成後(僅廣播一次) Intent.ACTION_BOOT_COMPLETED
檢測網絡變化 ConnectivityManager.CONNECTIVITY_ACTION
按下照相時的拍照按鍵(硬件按鍵)時 Intent.ACTION_CAMERA_BUTTON
屏幕鎖屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
設備當前設置被改變時(界面語言、設備方向等) Intent.ACTION_CONFIGURATION_CHANGED
插入耳機時 Intent.ACTION_HEADSET_PLUG
未正確移除SD卡但已取出來時(正確移除方法:設置–SD卡和設備內存–卸載SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL
插入外部儲存裝置(如SD卡) Intent.ACTION_MEDIA_CHECKING
成功安裝APK Intent.ACTION_PACKAGE_ADDED
成功刪除APK Intent.ACTION_PACKAGE_REMOVED
重啓設備 Intent.ACTION_REBOOT
屏幕被關閉 Intent.ACTION_SCREEN_OFF
屏幕被打開 Intent.ACTION_SCREEN_ON
關閉系統時 Intent.ACTION_SHUTDOWN
重啓設備 Intent.ACTION_REBOOT

  注:當使用系統廣播時,只需要在註冊廣播接收者時定義相關的action即可,並不需要手動發送廣播,當系統有相關操作時會自動進行系統廣播

9.有序廣播(Ordered Broadcast)

  定義:發出去的廣播,被廣播接收者按照先後順序接收,有序是針對廣播接收者而言的

  廣播接受者接收廣播的順序規則(包括動態註冊和靜態註冊):
    1.按照Priority屬性值從大-小排序
    2.Priority屬性相同者,動態註冊的廣播優先

  特點:
    1.接收廣播按順序接收
    2.先接收到的廣播接收者可以對廣播進行截斷,後接收到的廣播接收者不再接收到此廣播;
    3.先接收到的廣播接收者可以對廣播進行修改,後接收到的廣播接收者將接收到被修改後的廣播

  具體使用
    有序廣播的使用過程與普通廣播非常類似,差異僅在於廣播的發送方式
    sendOrderedBroadcast(intent, String);//string參數代表,權限
    abortBroadcast();//可以在先接收到的廣播接收者,進行進行攔截

10 . 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動態註冊,不能靜態註冊

這裏寫圖片描述

11.粘性廣播(Sticky Broadcast)

  由於在Android5.0 & API 21中已經失效,所以不建議使用,在這裏也不作過多的總結

12.特別注意

  對於不同註冊方式的廣播接收器回調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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章