1. 程式人生 > >作業三——觀察者模式在Android廣播機制上的應用

作業三——觀察者模式在Android廣播機制上的應用

方式 spa 文件 軟件設計 模塊 具體實現 其他應用 作用 android

觀察者模式在Android廣播機制上的應用

點擊跳轉項目git地址:https://github.com/Arfer-ustc/practice-Android.git

一、觀察者模式在Android中的應用及體現

  Android中可以體現觀察者模式的方式,例如消息機制EventBus、廣播機制BroadcastReceiver、BanerView和RecycleView的list刷新機制等都涉及到觀察者模式。首先介紹一下觀察者模式的概念:觀察者模式是軟件設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。舉個例子,如下代碼中,

package com.shijiacheng.observerpattern;

import java.util.Observable;

public class MyPerson extends Observable {

    private String name;
    private int age;
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        setChanged();
        notifyObservers();
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
        setChanged();
        notifyObservers();
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
        setChanged();
        notifyObservers();
    }

    @Override
    public String toString() {
        return "MyPerson [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    }
}

註意到:setChanged();notifyObservers();多了這兩句調用,通過setChanged();告知數據改變,通過notifyObservers();發送信號通知觀察者。降低了類成員變量之間的耦合性,增加執行效率。

二、針對項目中的代碼展開詳細論述——廣播機制中的觀察者模式

  Android中的廣播機制非常靈活,Android可以對應用內自己需要的消息添加廣播,也可以對應用外其他感興趣的內容添加廣播,例如應用可以收到手機系統關於手機電量的廣播,也可以收到其他應用手機推送的廣播,更可以收到應用內其他界面數據變化發來的廣播。具體分布如下圖所示:

技術分享圖片

  從實現原理看上,Android中的廣播使用了觀察者模式,基於消息的發布/訂閱事件模型。因此,從實現的角度來看,Android中的廣播將廣播的發送者和接受者極大程度上解耦,使得系統能夠方便集成,更易擴展。具體實現流程要點粗略概括如下:

  • 在AndroidManifest文件中靜態註冊或在代碼中進行動態註冊,廣播接收者BroadcastReceiver通過Binder機制向AMS(Activity Manager Service)進行註冊
  • 廣播發送者通過binder機制向AMS發送廣播
  • AMS查找符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver(一般情況下是Activity)相應的消息循環隊列中
  • 消息循環執行拿到此廣播,回調BroadcastReceiver中的onReceive()方法

  由此看來,廣播發送者和廣播接收者分別屬於觀察者模式中的消息發布和訂閱兩端,AMS屬於中間的處理中心。廣播發送者和廣播接收者的執行是異步的,發出去的廣播不會關心有無接收者接收,也不確定接收者到底是何時才能接收到。顯然,整體流程與EventBus非常類似。

三、通過使用觀察者模式帶來的好處

  觀察者模式的應用使項目代碼模塊間的耦合性得到很好的降低,子模塊的成員對父模塊的依賴得到很好的解決,不需要我們因為一個因素的變化從而再去改變另一個因素,通過觀察者模式,實時動態的反應元素變化,充當子模塊跟父模塊之間的管理橋梁,達到消息傳遞的作用。當一個對象狀態發生改變後,會影響到其他幾個對象的改變,這時候可以用觀察者模式。觀察者模式符合接口隔離原則,實現了對象之間的松散耦合

作業三——觀察者模式在Android廣播機制上的應用