★ Android基礎篇-你應該知道的 BroadcastReceiver

廣播的概念

Android:系統在產生某個事件時發送廣播,應用程序使用廣播接收者接收這個廣播,就知道系統產生了什麼事件。
Android系統在運行的過程中,會產生很多事件,比如開機、電量改變、收發短信、撥打電話、屏幕解鎖

廣播的類型
(1)無序(標準)廣播 :是一種完全異步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎同一時間接收到這條廣播消息,他們之間沒有任何順序可言.這種廣播效率更高,但是意味着無法截斷.

這裏寫圖片描述

(2)有序廣播:則是一種同步執行的廣播,在廣播發出去之後,同一時間只有一個廣播接收器能夠接受這條廣播的信息,當這個廣播接收器中的邏輯執行完畢後廣播纔會繼續傳遞.

這裏寫圖片描述

核心

廣播分爲兩個角色,廣播發送者,廣播接受者

實現原理
在android中的 BroadcastReceiver使用的設計模式則是觀察者模式基於消息發佈/訂閱事件模型

模型中有三個角色:

消息訂閱者(廣播接收者)
消息發佈者(廣播發布者)
消息中心(AMS,即Activity Manager Service)

這裏寫圖片描述

廣播接收者 通過 Binder機制在 AMS 註冊
廣播發送者 通過 Binder 機制向 AMS 發送廣播
AMS 根據 廣播發送者 要求,在已註冊列表中,尋找合適的廣播接收者
尋找依據:IntentFilter / Permission
AMS將廣播發送到合適的廣播接收者相應的消息循環隊列中;
廣播接收者通過 消息循環 拿到此廣播,並回調 onReceive()

廣播的註冊

廣播的註冊分爲靜態註冊與動態註冊

靜態註冊:這種方法是在配置AndroidManifest.xml配置文件中註冊,通過這種方式註冊的廣播爲常駐型廣播,也就是說如果應用程序關閉了,有相應事件觸發程序還是會運行.

       <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                //自定義Action
                <action android:name="MLY" />
            </intent-filter>
        </receiver>

動態註冊

 IntentFilter filter = new IntentFilter();
        filter.addAction("xia");
        dynamicReceiver = new DynamicReceiver();
        //註冊廣播接收
        registerReceiver(dynamicReceiver, filter);

設置addAction標籤,一定要setAction這個標籤,不然的話在DynamicReceiver中拿不到回調!

   public void send2(View v) {
        Intent intent = new Intent();
        intent.setAction("xia");
        intent.putExtra("sele", "特拉法爾加~羅");
        sendBroadcast(intent);
    }

效果圖:

這裏寫圖片描述

源碼地址:
http://download.csdn.net/detail/macaopark/9923045

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