Android Framework中的PolicyManager简介

Stella981
• 阅读 663

PolicyManager类位于framework\base\core\java\com\android\internal\policy目录中的PolicyManager.java文件中。PolicyManager主要用于创建Window类、LayoutInflater类和WindowManagerPolicy类,它扮演着简单工厂模式中的工厂类角色,而抽象产品角色由IPolicy接口实现,具体产品角色由Policy类实现。它们的关系如下图所示:

Android Framework中的PolicyManager简介

从下面三个类的代码可以看出,都使用了hide注解,因此,这三个类都是不对外公开的API,只限于Framework内部使用。

抽象产品类IPolicy实现如下(IPolicy.java):

  1. package com.android.internal.policy;

  2. import android.content.Context;

  3. import android.view.LayoutInflater;

  4. import android.view.Window;

  5. import android.view.WindowManagerPolicy;

  6. /**

  7. * {@hide}

  8. */

  9. /* The implementation of this interface must be called Policy and contained

  10. * within the com.android.internal.policy.impl package */

  11. public interface IPolicy {

  12. public Window makeNewWindow(Context context);

  13. public LayoutInflater makeNewLayoutInflater(Context context);

  14. public WindowManagerPolicy makeNewWindowManager();

  15. }

具体产品类Policy实现如下(Policy.java):

  1. package com.android.internal.policy.impl;

  2. import android.content.Context;

  3. import android.util.Log;

  4. import com.android.internal.policy.IPolicy;

  5. import com.android.internal.policy.impl.PhoneLayoutInflater;

  6. import com.android.internal.policy.impl.PhoneWindow;

  7. import com.android.internal.policy.impl.PhoneWindowManager;

  8. /**

  9. * {@hide}

  10. */

  11. // Simple implementation of the policy interface that spawns the right

  12. // set of objects

  13. public class Policy implements IPolicy {

  14. private static final String TAG = "PhonePolicy";

  15. //需要在Policy类创建时预先加载的一些类

  16. private static final String[] preload_classes = {

  17. "com.android.internal.policy.impl.PhoneLayoutInflater",

  18. "com.android.internal.policy.impl.PhoneWindow",

  19. "com.android.internal.policy.impl.PhoneWindow$1",

  20. "com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback",

  21. "com.android.internal.policy.impl.PhoneWindow$DecorView",

  22. "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState",

  23. "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState",

  24. };

  25. static {

  26. // 出于性能考虑,在Policy类加载时提前加载会用到的相关类

  27. for (String s : preload_classes) {

  28. try {

  29. //加载指定类到Java虚拟机中,并执行类中的静态代码段

  30. Class.forName(s);

  31. } catch (ClassNotFoundException ex) {

  32. Log.e(TAG, "Could not preload class for phone policy: " + s);

  33. }

  34. }

  35. }

  36. public PhoneWindow makeNewWindow(Context context) {

  37. return new PhoneWindow(context);

  38. }

  39. public PhoneLayoutInflater makeNewLayoutInflater(Context context) {

  40. return new PhoneLayoutInflater(context);

  41. }

  42. //PhoneWindowManager实现了WindowManagerPolicy接口

  43. //这里返回值直接写成WindowManagerPolicy更合理些

  44. public PhoneWindowManager makeNewWindowManager() {

  45. return new PhoneWindowManager();

  46. }

  47. }

工厂类PolicyManager实现如下(PolicyManager.java):

  1. package com.android.internal.policy; 
        
    
  2. import android.content.Context;

  3. import android.view.LayoutInflater;

  4. import android.view.Window;

  5. import android.view.WindowManagerPolicy;

  6. import com.android.internal.policy.IPolicy;

  7. /**

  8. * {@hide}

  9. */

  10. public final class PolicyManager {

  11. private static final String POLICY_IMPL_CLASS_NAME =

  12. "com.android.internal.policy.impl.Policy";

  13. private static final IPolicy sPolicy;

  14. static {

  15. // 运行时动态装载IPolicy实现类

  16. try {

  17. //加载Policy类的同时会执行其中的静态代码段

  18. Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);

  19. sPolicy = (IPolicy)policyClass.newInstance();

  20. } catch (ClassNotFoundException ex) {

  21. throw new RuntimeException(

  22. POLICY_IMPL_CLASS_NAME + " could not be loaded", ex);

  23. } catch (InstantiationException ex) {

  24. throw new RuntimeException(

  25. POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);

  26. } catch (IllegalAccessException ex) {

  27. throw new RuntimeException(

  28. POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);

  29. }

  30. }

  31. // 构造函数私有,保证是单例类

  32. private PolicyManager() {}

  33. // The static methods to spawn new policy-specific objects

  34. public static Window makeNewWindow(Context context) {

  35. return sPolicy.makeNewWindow(context);

  36. }

  37. public static LayoutInflater makeNewLayoutInflater(Context context) {

  38. return sPolicy.makeNewLayoutInflater(context);

  39. }

  40. public static WindowManagerPolicy makeNewWindowManager() {

  41. return sPolicy.makeNewWindowManager();

  42. }

  43. }


  44.  
    

更多0

点赞
收藏
评论区
推荐文章
桃浪十七丶 桃浪十七丶
3年前
工厂模式实例(顺便回忆反射机制的应用)
一、原理反射机制的原理JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。工厂模式自述所谓工厂模式,是说由某个产品类接口、产品实现类、工厂类、客户端(单元测试主类)构成的一个模式,大程度的降低了代码的
Easter79 Easter79
3年前
SpringIOC
XML方式:IOC:控制反转的底层原理就是:工厂模式反射配置文件DI:依赖注入就是通过配置文件设置属性值BeanFactory 是老版本的工厂类:调用getBean的时候,才会生成类的实例ApplicationContext 是新版本的工厂类:加载配置文件的时候,就会将Spring管理的类
Wesley13 Wesley13
3年前
C#简单工厂模式
C简单工厂模式模型,建立一个模型,构建我们的实际工程,项目。​所有面向对象的编程都是在我们生活中存在的,从词义的解释就是我们生活中的工厂就是负责生产产品的,而到开发中对应的就是NEW不同的对象,该模式主要解决的问题就是解决创建对象与该类的解耦。设计原则中经常说的类单一职责、封装性都有体现。编程中的简单工厂就是一个生产
Stella981 Stella981
3年前
Android学习笔记之AndroidManifest.xml文件解析
一、关于AndroidManifest.xmlAndroidManifest.xml是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities,services,等等),他们各自的实现类,各种能被处理的数据和启动位置。除了能声明程序中的Activities,ContentProvider
Stella981 Stella981
3年前
Python之设计模式
一、设计模式分类a、创建型模式简单工厂模式一、内容不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。二、角色工厂角色(Creator)抽象产品角色(Product)具体产品角色(ConcreteProduct)
Wesley13 Wesley13
3年前
4种常见的 PHP 设计模式
工厂模式在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。_工厂模式_ 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 
Wesley13 Wesley13
3年前
Java设计模式
模式描述工厂方法模式提供一个用于创建产品的接口,由实现类决定实现哪些产品。工厂方法模式使一个类的实例化延迟到子类,并且只适用于一个产品的等级结构。优点可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关。例子还是以之前简单工厂的手机为案例:/
Stella981 Stella981
3年前
C#中Activator.CreateInstance()方法用法分析
本文实例讲述了C中Activator.CreateInstance()方法用法。Activator类包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。C在类工厂中动态创建类的实例,所使用的方法为:1.Activator.CreateInstance(Type)2.Activator.
Wesley13 Wesley13
3年前
C++ 常用设计模式(学习笔记)
设计模式1、工厂模式在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。1.1、简单工厂模式主要特点是需要在工厂类中做判断,从而创造相应的产品,当
小万哥 小万哥
8个月前
Java 日期和时间 API:实用技巧与示例 - 轻松处理日期和时间
Java用户输入(Scanner)简介Scanner类用于获取用户输入,它位于java.util包中。使用Scanner类要使用Scanner类,请执行以下步骤:1.导入java.util.Scanner包。2.创建一个Scanner对象,并将其初始化为S