Android 動態註冊廣播接收器

 從本質來說,Android 系統的廣播機制是一種消息訂閱/發佈機制,因此,使用這種消息驅動模型的第一步便是訂閱消息;而對 Android 應用程序來說,訂閱消息其實就是註冊廣播接收器。
    註冊的方法有兩種,一種是靜態註冊,一種是動態註冊。在 Android 的廣播機制中,動態註冊的優先級是要高於靜態註冊優先級的,因此在必要的情況下,我們是需要動態註冊廣播接收器的。

    先回顧一下靜態註冊。所謂註冊,就是在 Manifest.xml 中去註冊廣播接收器。
[java]
<receiver android:name="" > 
           <intent-filter android:priority="2147483647" > 
               <action android:name="android.provider.Telephony.SMS_RECEIVED" > 
               </action> 
           </intent-filter> 
       </receiver> 
    然後再創建一個繼承 BroadcastReceiver 得類即可。在這裡要特意強調一下的是,intent-filter 標簽中的 priority 是設置廣播接收器的優先級,網上很多資料都表示,優先級的設置數值為1000~-1000,1000最大,但事實上,當 priority 值為integer 的最大值才時,才是優先級最高的,即  2147483647;當然,“最高”隻是限於靜態註冊。
    瞭解更多關於靜態註冊信息,可參考《【Android】短信應用——短信信息實時獲取》https://www.aiwalls.com/kf/201203/122378.html 一文,其短信信息的獲取就是運用瞭廣播接收器的靜態註冊。

    下面回到正題,如何動態註冊廣播接收器。

    首先,我們來寫一個內部類,繼承 BroadcastReceiver。
[java]
private BroadcastReceiver myReceiver = new BroadcastReceiver() { 
 
        @Override 
        public void onReceive(Context context, Intent intent) { 
            Toast.makeText(context, "myReceiver receive", Toast.LENGTH_SHORT) 
                    .show(); 
        } 
 
    }; 
    onReveice 中我們寫一個 Toast,稍後用來檢測廣播接收器是否成功註冊。

    下面來看看如何去註冊廣播接收器。
[java]
private static final String ACTION = "cn.etzmico.broadcastreceiverregister.SENDBROADCAST"; 
[java]
IntentFilter filter = new IntentFilter(); 
                filter.addAction(ACTION); 
                filter.setPriority(Integer.MAX_VALUE); 
                registerReceiver(myReceiver, filter); 
    我們在註冊的時候也來設置下優先級,正如上面文章提到的,用 Integer  的最大值來獲得廣播機制中的最高優先級。

    廣播註冊完畢,下面就是來做測試,來檢驗廣播接收器是否註冊個成功。

   
[java]
sendBroadcast(new Intent(ACTION)); 

    動態註冊廣播接收器還有一個特點,就是當用來註冊的 Activity 關掉後,廣播也就失效瞭。同時反映瞭靜態註冊的一個優勢,就是無需擔憂廣播接收器是否被關閉,隻要設備是開啟狀態,廣播接收器就是打開著的。
    不過,我們可以通過將廣播接收器在 Service 中動態註冊,並設置開機自啟動,這樣一來,就不會擔心像Activity一樣的關閉問題瞭。但又如果要用“自啟動管傢”等帶有管理開機自啟動程序功能的軟件講相關自啟動程序關閉時,廣播接收器也就無法成功註冊瞭。要想解決這個問題,就要看源碼,是否能防止程序的自啟動被關閉。另外,現市場上有沒有程序能通過管理廣播接收器來關閉靜態註冊的廣播接收器,我還在調研,目前沒有發現,如果有知道的,歡迎留言說明~謝謝!
    後續的文章我會寫一篇關於通過動態註冊廣播接收器方法來實現有最高優先級的短信攔截功能的文章。文章中會提到如何開機自啟動 Service 和 用 Service 動態註冊廣播接收器,敬請關註!謝謝~

PS:之前附加的資源有一個小BUG,給大傢帶來瞭不便,不好意思!!!下面的鏈接是新上傳的……沒BUG的……I promise! 

摘自  Etzmico 

發佈留言