android 靜態、動態註冊廣播淺析
前言
程式碼優化過程中發現好多app的全域性網路監聽使用動態註冊廣播方式,而沒有采用在清單檔案中進行註冊
產生了疑問,研究開來知識點還是有一些。總結如下
1.廣播的註冊方式
在Android中有兩種方式,即動態註冊(程式碼註冊)、靜態註冊(清單檔案註冊)
靜態:
<receiver android:name=".persenter.reciver.InternetStaticBroadCastReceiver">
<intent-filter>
<action android:name ="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
動態:
private void registerReceiver(BroadcastReceiver bc, String action) {
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(action);
context.registerReceiver(bc, mFilter);
}
反註冊
unregisterReceiver(BroadcastReceiver);
2.廣播註冊方式優缺點
靜態註冊廣播
1.優先順序低於動態廣播
2.註冊後一直執行,儘管Activity、程序、App被殺死還是可以接收到廣播
(官網解釋:從Android的原始碼中找到了這樣的註釋:If this BroadcastReceiver was launched through a
tag, then the object is no longer alive after returning from this function.
This means you should not perform any operations that return a result to you asynchronously.
這段文字告訴我們:如果通過標籤來註冊的BroadcastReceiver,
那麼該物件的例項在onReceive被呼叫之後就會在任意時間內被銷燬。也就是說,我們並需要擔心靜態註冊的BroadcastReceiver的銷燬問題。)
3.廣播註冊到系統廣播佇列。受到全域性廣播影響。
動態廣播
1.優先順序高於靜態廣播
2.可以隨意控制廣播的建立和銷燬
3.自由,靈活度較高
4.app內註冊的廣播,對系統廣播進行隔離。作用域在app內
3、Broadcast Receiver的使用場景
同一App具有多個程序的不同元件之間的訊息通訊(傳送廣播吊起撥打電話,contentprivader)
不同App之間的元件之間的訊息通訊
4、Broadcast Receiver的種類
普通廣播
有序廣播
本地廣播
Sticky廣播
5、LocalBroadcastManager特點
本地廣播只能在自身App內傳播,不必擔心洩漏隱私資料
本地廣播不允許其他App對你的App傳送該廣播,不必擔心安全漏洞被利用
本地廣播比全域性廣播更高效
以上三點都是源於其內部是用Handler實現的
6、Android中跨程序通訊的幾種方式
訪問其他應用程式的Activity,如呼叫系統通話應用
Content Provider,如如訪問系統相簿
廣播,如顯示系統時間
AIDL
總結:
本文是說明靜態和動態註冊廣播針對app內網路監聽應用問題,最後知道為什麼app中全域性網路監聽採用動態註冊廣播原因,不採用靜態註冊方式(在清單檔案中宣告廣播),是因為靜態註冊廣播,無法及時反註冊,會造成同一個廣播導致所有能接收到的類(Activity,Fragment)執行相應的網路切換邏輯,當然可以去控制只重新整理當前前臺類。這是一個隱患。原因2,採用靜態廣播和採用動態註冊的廣播程式碼量差不多,那什麼時候使用靜態廣播呢,我能想到的就是系統應用。