廣播的概念
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