加入收藏 | 设为首页 | 会员中心 | 我要投稿 文章分享网_茂名站长网 (https://www.0668zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Android Framework中的PolicyManager详解

发布时间:2021-11-24 13:15:42 所属栏目:教程 来源:互联网
导读:根据云计算网_泰州站长网 Www.0523Zz.Com报道 PolicyManager类位于frameworkbasecorejavacomAndroidinternalpolicy目录中的PolicyManager.java文件中。PolicyManager主要用于创建Window类、LayoutInflater类和WindowManagerPolicy类,它扮演着简单工厂
根据云计算网_泰州站长网 Www.0523Zz.Com报道

PolicyManager类位于frameworkbasecorejavacomAndroidinternalpolicy目录中的PolicyManager.java文件中。PolicyManager主要用于创建Window类、LayoutInflater类和WindowManagerPolicy类,它扮演着简单工厂模式中的工厂类角色,而抽象产品角色由IPolicy接口实现,具体产品角色由Policy类实现。它们的关系如下图所示:
 
 
 
从下面三个类的代码可以看出,都使用了hide注解,因此,这三个类都是不对外公开的API,只限于Framework内部使用。
 
抽象产品类IPolicy实现如下(IPolicy.java):
 
[java]
package com.android.internal.policy;  
  
import android.content.Context;  
import android.view.LayoutInflater;  
import android.view.Window;  
import android.view.WindowManagerPolicy;  
  
/**
 * {@hide}
 */  
  
/* 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();  
}  
具体产品类Policy实现如下(Policy.java):
 
[java]
package com.android.internal.policy.impl;  
  
import android.content.Context;  
import android.util.Log;  
  
import com.android.internal.policy.IPolicy;  
import com.android.internal.policy.impl.PhoneLayoutInflater;  
import com.android.internal.policy.impl.PhoneWindow;  
import com.android.internal.policy.impl.PhoneWindowManager;  
  
/**
 * {@hide}
 */  
  
// Simple implementation of the policy interface that spawns the right   
// set of objects   
public class Policy implements IPolicy {  
    private static final String TAG = "PhonePolicy";  
  
    //需要在Policy类创建时预先加载的一些类   
    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 {  
        // 出于性能考虑,在Policy类加载时提前加载会用到的相关类   
        for (String s : preload_classes) {  
            try {  
        //加载指定类到Java虚拟机中,并执行类中的静态代码段   
                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);  
    }  
  
    //PhoneWindowManager实现了WindowManagerPolicy接口       
    //这里返回值直接写成WindowManagerPolicy更合理些   
    public PhoneWindowManager makeNewWindowManager() {  
        return new PhoneWindowManager();  
    }  
}  
工厂类PolicyManager实现如下(PolicyManager.java):
 
[java]
package com.android.internal.policy;  
  
import android.content.Context;  
import android.view.LayoutInflater;  
import android.view.Window;  
import android.view.WindowManagerPolicy;  
  
import com.android.internal.policy.IPolicy;  
  
/**
 * {@hide}
 */  
  
public final class PolicyManager {  
    private static final String POLICY_IMPL_CLASS_NAME =  
        "com.android.internal.policy.impl.Policy";  
  
    private static final IPolicy sPolicy;  
  
    static {  
       // 运行时动态装载IPolicy实现类   
        try {  
           //加载Policy类的同时会执行其中的静态代码段   
            Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);  
            sPolicy = (IPolicy)policyClass.newInstance();  
        } catch (ClassNotFoundException ex) {  
            throw new RuntimeException(  
                    POLICY_IMPL_CLASS_NAME + " could not be loaded", ex);  
        } catch (InstantiationException ex) {  
            throw new RuntimeException(  
                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);  
        } catch (IllegalAccessException ex) {  
            throw new RuntimeException(  
                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", 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();  
    }  
}  

(编辑:文章分享网_茂名站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读