1. 程式人生 > >android 靜態、動態註冊廣播淺析

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,採用靜態廣播和採用動態註冊的廣播程式碼量差不多,那什麼時候使用靜態廣播呢,我能想到的就是系統應用。