Android Framework中的PolicyManager简介

2024-09-05 09:32

本文主要是介绍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):

[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();
 }
 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();
     }
 }
 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]
 <pre class="java" name="code">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();
     }
 }
 <pre class="java" name="code">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();
     }
 }
 

这篇关于Android Framework中的PolicyManager简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138575

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使