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;