PolicyManager原廠模式與動態載入

來源:互聯網
上載者:User

PolicyManager原廠模式與動態載入

                                     Android FrameWork——PolicyManager

在學習Android跟蹤setContentView執行過程代碼的時遇到:

Attach(){

  //著實不清楚PolicyManager到底如何建立的,哪一個對象。

  mWindow = PolicyManager.makeNewWindow(this);

}

其中用到Class.forName動態載入,Java是最近才學的還真不曉得有這樣的用法;

一 類之間關係

於是就瞭解一下PolicyManager以及相關類實現方式;

首先看一下各個類之間的UML圖:

    

PolicyManager:提供了靜態類方法介面,用於建立Window,LayoutInflate,

         WindowManagerPolicy類執行個體;屬於Factory 方法;

IPolicy:提供抽象Policy建立產品介面;

Policy:具體IPolicy,實現建立產品介面;

二 程式碼分析

1 IPolicy

         

/* The implementation of this interface must be called Policy and contained * within the com.android.internal.policy.impl package */public interface IPolicy {    public Window makeNewWindow(Context context);    public LayoutInflater makeNewLayoutInflater(Context context);public WindowManagerPolicy makeNewWindowManager();          }

 

2 Policy

         

public class Policy implements IPolicy {    private static final String TAG = "PhonePolicy";
  //提供需要積極式載入的 類 private static final String[] preload_classes = { "com.android.internal.policy.impl.PhoneLayoutInflater", "com.android.internal.policy.impl.PhoneWindow", "com.android.internal.policy.impl.PhoneWindow$1", "com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback", "com.android.internal.policy.impl.PhoneWindow$DecorView", "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState", "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState", };
  //靜態模組 static { // For performance reasons, preload some policy specific classes when // the policy gets loaded. for (String s : preload_classes) { try {          //動態載入指定的類 Class.forName(s); } catch (ClassNotFoundException ex) { Log.e(TAG, "Could not preload class for phone policy: " + s); } } }
  //建立具體對象的介面 public PhoneWindow makeNewWindow(Context context) { return new PhoneWindow(context); } public PhoneLayoutInflater makeNewLayoutInflater(Context context) { return new PhoneLayoutInflater(context); } public PhoneWindowManager makeNewWindowManager() { return new PhoneWindowManager(); }}

 

3 PolicyManager

 

//訪問類的靜態成員的時候 會載入該類public final class PolicyManager {    private static final String POLICY_IMPL_CLASS_NAME =        "com.android.internal.policy.impl.Policy";
private static final IPolicy sPolicy; //載入該類時,所有靜態成員均被會載入 static { try {       //動態載入建立類執行個體      Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);      //建立了sPolicy指向的執行個體 sPolicy = (IPolicy)policyClass.newInstance(); } catch (ClassNotFoundException ex) {} } //建構函式私人類型,不能建立該類執行個體 private PolicyManager() {} // The static methods to spawn new policy-specific objects public static Window makeNewWindow(Context context) { return sPolicy.makeNewWindow(context); } public static LayoutInflater makeNewLayoutInflater(Context context) { return sPolicy.makeNewLayoutInflater(context); } public static WindowManagerPolicy makeNewWindowManager() { return sPolicy.makeNewWindowManager(); }}

 

這裡要注意的就是:動態載入Class.forName

Class.forName()返回一個類;

String str = 使用者輸入的字串

Class classType = Class.forName(str);   //返回一個類

classType.newInstance();                           //建立一個classType 類型的對象

 

在上述代碼中:

Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);                  //載入Policy類

sPolicy = (IPolicy)policyClass.newInstance();  //建立Policy對象 給IPolicy類型sPolicy引用;

 

這樣動態載入加上使用Factory 方法:降低耦合,提高代碼的靈活性和擴充性;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.