Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android源碼中的抽象工廠---IPolicy

Android源碼中的抽象工廠---IPolicy

編輯:關於Android編程

抽象工廠應用是很廣的,在Android源碼中,這個IPolicy就是一個簡單的抽象工廠模式。下面分析一下IPolicy及其實現,以及創建的相關對象(源碼基於5.0.0)。

抽象工廠

意圖

提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們具體的類。

UML類圖

此處輸入圖片的描述

通過繼承抽象工廠,可以產生不同的產品系列

代碼示例

    abstract class AbsFactory{
        public abstract AbsProductA createProduct1();
        public abstract AbsProdcutB createProduct2();
    }

    abstract class AbsProductA{
    }
    abstract class AbsProductB{
    }
    class ProductA1 extends AbsProductA{
    }
    class ProductB1 extends AbsProductB{
        public void interactWithProductA(AbsProductA product){ //與ProductA關聯
        }
    }

    class ConcreteFactory1 extends AbsFactory{
        private static ConcreteFactory instance = new ConcreteFactory();
        public ConcreteFactory getInstance(){
            return instance;
        }
        public AbsProductA createProductA(){
            return new ProductA1();
        }
        public AbsProdcutB createProductB(){
            return new ProductB1();
        }
    }

    public static void main(String[] args){
        ConcreteFactory instance = ConcreteFactory.
        AbsProductA product1 = instance.createProductA();
        AbsProductB product2 = instance.createProductB();
        product2.interactWithProductA(product1);
    }

抽象工廠就是創建一系列相互關聯的對象,這樣每一個抽象工廠的具體實現創建的對象都是相互關聯的,而且可以是不同的產品系列,相當於從上層就設計好了一套產品規范。這裡只是簡單介紹了一下抽象工廠。如果想很好的理解可以參考設計模式:可復用面向對象軟件的基礎關於抽象工廠的介紹。下面介紹IPolicy。

IPolicy

IPolicy在com.android.internal.policy包下面。它是關於Android窗口,窗口管理,布局加載,以及事件回退Handler這一系列窗口相關產品的抽象工廠。先看IPolicy的UML類圖。

UML圖

 

IPolicy是產生窗口屏幕相關對象的抽象接口,在Android手機源碼中,com.android.internal.policy.impl.Policy是它的唯一一個實現,按照源碼中的注釋所說的,是Policy是IPolicy的一個簡單實現,用來生成對象集合。Policy創建一系列的Phone的窗口相關對象:PhoneWindow,PhoneLayoutInflater,PhoneWindowManager,PhoneFallbackEventHandler。從UML圖就可以看出,IPolicy算是一個典型的抽象工廠,只不過在源碼中只有一個具體的工廠實現。

另外Policy的實現還有一點特殊的地方,它使用static域將他需要創建的對象都預先load出來,也就是說當虛擬機加載Policy類的時候,就會加載它創建的對象的class。

相關對象介紹

下面分別介紹IPolicy創建的每個對象

PolicyManager

PolicyManager相當於是這個抽象工廠的客戶端,它只有靜態方法,他它的靜態方法跟IPolicy的接口是相對應的。它內部包含了一個Policy對象,相當於是Policy的一個代理,對應的創建操作都會交給Policy去創建,比如說makeNewWindow方法的實現:

// The static methods to spawn new policy-specific objects
public static Window makeNewWindow(Context context) {
    return sPolicy.makeNewWindow(context);
}

Window與PhoneWindow

Window是Android中的窗口,每個Activity都會對應著一個Window,在Activity的attach方法中,就有Window的創建代碼:

    final void attach(Context context, ActivityThread aThread,
        Instrumentation instr, IBinder token, int ident,
        Application application, Intent intent, ActivityInfo info,
        CharSequence title, Activity parent, String id,
        NonConfigurationInstances lastNonConfigurationInstances,
        Configuration config, IVoiceInteractor voiceInteractor) {
        attachBaseContext(context);

        mFragments.attachActivity(this, mContainer, null);

        mWindow = PolicyManager.makeNewWindow(this);
        mWindow.setCallback(this);
        mWindow.setOnWindowDismissedCallback(this);
        mWindow.getLayoutInflater().setPrivateFactory(this);
        ...

attach方法是將Context,application等賦值給Activity,在Activiy啟動的過程會調用。我們彈出的對話框(Dialog),裡面也是有一個Window的。另外與Activity對應的還有啟動窗口(Starting Window)。一個Window還可以有子Window。另外Android中還有一些其他的窗口還有輸入法窗口,狀態欄窗口,壁紙窗口。

窗口有一個專門的窗口管理服務WindowManagerService,在WindowManagerService中與每個Activity對應的為AppWindowToken,而AppWindowToken描述的是一組窗口(一組WindowState),對應於Activity中Context的各種窗口。

而手機中, Window的具體實現是PhoneWindow。PhoneWindow是對應著Android手機的Window實現。PhoneWindow裡面包含了DecorView, DecorView包含了標題欄以及具體View(由setContentView設置)。它們之間的關系如下:

phonewindow

而真正直接關聯Window與View的是WindowManager,由Window.setWindowManager設置。每個Window都會對應一個WindowManager。通過WindowManager的addView,updateViewLayout,removeView來添加,更新,移除Window中的View。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPs2ouf1jb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSm/ydLUu/G1w1dpbmRvd01hbmFnZXKjrNXiuPa+zcrHQWN0aXZpdHm1xG1XaW5kb3e1xFdpbmRvd01hbmFnZXKjrLb4V2luZG93TWFuYWdlcrXEvt/M5cq1z9bKx1dpbmRvd01hbmFnZXJJbXBso6y2+FdpbmRvd01hbmFnZXJJbXBs09a74b2rV2luZG93tcTP4LnYstnX9yhhZGRWaWV3LCByZW1vdmVWaWV3Kb27uPhXaW5kb3dNYW5hZ2VyR2xvYmFswLTKtc/WoaNXaW5kb3dNYW5hZ2VyR2xvYmFsysfSu7j2taXA/cSjyr2jrMDvw+aw/LqswcvSu7j2Vmlld1Jvb3RJbXBswdCx7aOoQXJyYXlMaXN0o6mjrNK7uPZWaWV3wdCx7aOsINK7uPZXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtc8HQse2jrMj9uPbBtLHtz+C7pbbU06ajrLHtyr7Su7j2Vmlld7bU06a1xExheW91dFBhcmFtc7rNVmlld1Jvb3Sho1dpbmRvd01hbmFnZXJHbG9iYWy78cihwctXaW5kb3dNYW5hZ2VyU2VydmljZbXEQmluZGVyvdO/2klXaW5kb3dNYW5hZ2VyoaNWaWV3Um9vdEltcGzNqLn9V2luZG93TWFuYWdlckdsb2JhbLXESVdpbmRvd01hbmFnZXK78cihV2luZG93U2Vzc2lvbihCaW5kZXK1xFByb3h5KaOsvatWaWV3Um9vdEltcGy1xFejqEJpbmRlcrbUz/OjqbSruPhXaW5kb3dNYW5hZ2VyU2VydmljZaOswLTT61dpbmRvd01hbmFnZXJTZXJ2aWNlz+C7pc2o0MWho8v7w8fWrrzktcRVTUzNvMjnz8KjujwvcD4NCjxwPjxpbWcgYWx0PQ=="windowmanager" src="/uploadfile/Collfiles/20160420/20160420093508451.png" title="\" />

WindowManagerPolicy,PhoneWindowManager

這個WindowManagerPolicy不同於Window中介紹的WindownManager,Window中介紹的WindowManager是屬於Window與View交互的管理,而WindowManagerPolicy則是更多地傾向於對Window屏幕的管理,比如說啟動窗口就是由它創建的。也包括一個具體的屏幕管理,比如說獲取屏幕顯示的大小,屏幕旋轉,屏幕設置等等。PhoneWindowManager是WindowManagerPolicy在手機規格下的實現。WindowManagerPolicy還有一個內部靜態類WindowManagerPolicy.WindowState,它是由WindowManagerService管理的,從一個窗口開始添加就存在,到窗口移除就刪除,是一個窗口的狀態接口,可以獲得當前窗口所屬的進程,包名,當前的Frame

LayoutInflater,PhoneLayoutInflater

LayoutInflater應該都比較熟悉,它是Android中用於XML布局加載的類,它是一個抽象類,PhoneLayoutInflater是它在Android手機上面的實現。PhoneLayoutInflater中主要是實現了onCreateView方法和cloneInContext方法。

FallbackEventHandler,PhoneFallbackEventHandler

這個是回退事件Handler,主要是為了處理回退事件(Fallback)。

IPolicy抽象工廠的設計分析

如果只看IPolicy,PolicyManager,Policy的UML,你會發現其實這三個部分也像是一個策略模式的UML圖。這部分裡面本身也可以說是一種策略,一種創建的策略。但把IPolicy作為抽象工廠理解會更為合適,它負責生成一系列相關產品,卻不用管產品的具體實現。

首先說說這四個產品之間的關系,Window是表示窗口,抽象的窗口管理,而WindowManagerPolicy是關於窗口屏幕的管理策略,LayoutInflater是XML解析器,將XML解析為Window中具體元素View,最後FallbackEventHandler是回退事件Handler,事件會作用在窗口上面。這四個產品在不同的產品簇的具體表現會是不一樣的,但是他們又有相互之間的關聯。用一個統一的創建接口,在使用這些接口的時候會更加方便。

就拿Phone的這四種產品實現來說,Phone的Window,以及WindowManagerPolicy自然是不同的,另外LayoutInflater也會有所不同,比如XML的View可能限制不一樣,在PhoneLayoutInflater中會從包名前綴為”android.widget.”,”android.webkit.”,”android.app.”這三個來創建View。另外如果產品簇是TV的話,FallbackEventHandler處理可能是直接回退到上一個台,而Phone的話會是返回上一個操作。

用四個工廠方法實現

其實四種不同的產品(Window,WindowManagerPolicy,LayoutInflater,是XML解析器,將XML解析為Window中具體元素View,最後FallbackEventHandler),如果用四個工廠方法也肯定是可以的,但是會缺乏將本來應該有相互關聯的產品拆分開了,抽象工廠一定程度上提高了它們之間的耦合性。

擴展優勢分析

假如除了Phone外,又突然有了一種新的產品簇(比如說TV,智能手表,我暫時並沒有調查這兩種的實現方式),那麼只需要創建一個對應Policy,以及對應的產品系列,然後將PolicyManager的IPolicy指向新產品簇的Policy就好了。

   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved