Android Framework中的PolicyManager简介

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

从下面三个类的代码可以看出,都使用了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. <pre class\="java" name="code"\>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. }</pre><br>

  44. <br>
  45. <p></p>
  46. <p></p>
  47. <p></p>
  48. <pre></pre>
  49. <pre></pre>

更多0

点赞
收藏

评论区

加载中...

相关推荐

工厂模式实例(顺便回忆反射机制的应用)

一、原理反射机制的原理JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。工厂模式自述所谓工厂模式,是说由某个产品类接口、产品实现类、工厂类、客户端(单元测试主类)构成的一个模式,大程度的降低了代码的

Java中的静态类

问题:_Isthereanythinglikestaticclassinjava?_java中是否有类似staticclass东西?_Whatisthemeaningofsuchaclass._这样的课是什么意思。_Doallthemethodsofthestaticc

SpringIOC

XML方式:IOC:控制反转的底层原理就是:工厂模式反射配置文件DI:依赖注入就是通过配置文件设置属性值BeanFactory 是老版本的工厂类:调用getBean的时候,才会生成类的实例ApplicationContext 是新版本的工厂类:加载配置文件的时候,就会将Spring管理的类

C#简单工厂模式

C简单工厂模式模型,建立一个模型,构建我们的实际工程,项目。​所有面向对象的编程都是在我们生活中存在的,从词义的解释就是我们生活中的工厂就是负责生产产品的,而到开发中对应的就是NEW不同的对象,该模式主要解决的问题就是解决创建对象与该类的解耦。设计原则中经常说的类单一职责、封装性都有体现。编程中的简单工厂就是一个生产

Android学习笔记之AndroidManifest.xml文件解析

一、关于AndroidManifest.xmlAndroidManifest.xml是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities,services,等等),他们各自的实现类,各种能被处理的数据和启动位置。除了能声明程序中的Activities,ContentProvider

4种常见的 PHP 设计模式

工厂模式在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。_工厂模式_ 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 

Android Framework中的PolicyManager简介 - HelloWorld