zoukankan      html  css  js  c++  java
  • PolicyManager工厂模式与动态加载

    PolicyManager工厂模式与动态加载

                                         Android FrameWork——PolicyManager

    在学习Android跟踪setContentView执行过程代码的时遇到:

    Attach(){

      //着实不清楚PolicyManager到底如何创建的,哪一个对象。

      mWindow = PolicyManager.makeNewWindow(this);

    }

    其中用到Class.forName动态加载,Java是最近才学的还真不晓得有这样的用法;

    一 类之间关系

    于是就了解一下PolicyManager以及相关类实现方式;

    首先看一下各个类之间的UML图:

        

    PolicyManager:提供了静态类方法接口,用于创建Window,LayoutInflate,

             WindowManagerPolicy类实例;属于工厂方法;

    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引用;

     

    这样动态加载加上使用工厂方法:降低耦合,提高代码的灵活性和扩展性;

  • 相关阅读:
    所有的工作目录 都要svn_开头,并且要进行svn同步,你能保证你不删除,你保证不了非你!
    火狐删除配置文件 会删除目录下所有文件 切记不要把配置文件建立在桌面 恢复软件:易我数据恢复向导 9.0 DiskGenius500
    谷歌全屏脚本 start chrome.exe --kiosk http://www.baidu.com
    bat2exe 就是这么简单 白研究半天VC++了
    火狐加载用户配置文件 "C:XXXMozilla Firefoxfirefox.exe" http://192.168.1.1:8080 -profile ../kkk
    https://quotefancy.com/ 经典句子(英语) 真是特别好~
    (function(){})() 立即执行函数
    jekyll 将纯文本转化为静态网站和博客 静态网站生成器
    vue 发布build 本地设置 相对路径 两个地方 一个根目录用./ css文件里面用../../ 【也不好用,还是得手改】
    iview构建 初始化的时候不要装ESlint 太烦人了
  • 原文地址:https://www.cnblogs.com/bastard/p/2438964.html
Copyright © 2011-2022 走看看