編輯:關於Android編程
抽象工廠應用是很廣的,在Android源碼中,這個IPolicy就是一個簡單的抽象工廠模式。下面分析一下IPolicy及其實現,以及創建的相關對象(源碼基於5.0.0)。
提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們具體的類。
通過繼承抽象工廠,可以產生不同的產品系列
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在com.android.internal.policy包下面。它是關於Android窗口,窗口管理,布局加載,以及事件回退Handler這一系列窗口相關產品的抽象工廠。先看IPolicy的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相當於是這個抽象工廠的客戶端,它只有靜態方法,他它的靜態方法跟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是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設置)。它們之間的關系如下:
而真正直接關聯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不同於Window中介紹的WindownManager,Window中介紹的WindowManager是屬於Window與View交互的管理,而WindowManagerPolicy則是更多地傾向於對Window屏幕的管理,比如說啟動窗口就是由它創建的。也包括一個具體的屏幕管理,比如說獲取屏幕顯示的大小,屏幕旋轉,屏幕設置等等。PhoneWindowManager是WindowManagerPolicy在手機規格下的實現。WindowManagerPolicy還有一個內部靜態類WindowManagerPolicy.WindowState,它是由WindowManagerService管理的,從一個窗口開始添加就存在,到窗口移除就刪除,是一個窗口的狀態接口,可以獲得當前窗口所屬的進程,包名,當前的Frame
LayoutInflater應該都比較熟悉,它是Android中用於XML布局加載的類,它是一個抽象類,PhoneLayoutInflater是它在Android手機上面的實現。PhoneLayoutInflater中主要是實現了onCreateView方法和cloneInContext方法。
這個是回退事件Handler,主要是為了處理回退事件(Fallback)。
如果只看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就好了。
最近沒事做就寫了一下PopupWindow,希望對有些人有點幫助。照常先看一下完成後的結果(界面比較難看就不要吐槽了)點擊地理位置然後彈出的PopupWindow,數據我
你應該有過手機解鎖密碼忘記的經歷吧,一開始對圖案解鎖十分好奇,設置了一個比較復雜的圖案,只是沒有過多久就忘記了,只能通過刷機解決了,還好本文的出現將會幫助一
准備階段 將WebInfos文件夾放在手機存儲卡的根目錄下,用Eclipse導入項目WebSerser,運行到手機中。 將WebInfos文件夾放在手機存
SharedPreferences是Android提供用來存儲一些簡單的配置信息的一種機制,例如,一些默認歡迎語、登錄的用戶名和密碼等。其以鍵值對的方式存儲
最近自家的系統要做一個升級服務,裡面有三個功能,第一個是系統升級,也就是