在android中policymanager

2012-09-28 19:35:40|分类:默认分类|字号订阅

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();
}
}

评论这张 转发至微博 分享到: 阅读(184) | 评论(0) | 转载 (0) | 举报 在android中AudioManager应用 在android中packgermanager中

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. python list.sort()根据多个关键字排序的方法实现
  3. Android实现下载文件功能的方法
  4. Android(安卓)实现View中添加子元素的动态效果
  5. Android(安卓)主流图片库Picasso Glide Fresco对比分析
  6. android实践项目一实现简单的验证码和spinner下拉选项效果
  7. android 中使用TextView实现分段显示不同颜色的字符串
  8. APIDEMO PREFERENCE 学习 ACTIVTIY
  9. Hybrid(在Android中的实现)

随机推荐

  1. Android(安卓)关闭(删除)FM Transmitter
  2. Android_嵌入chrome浏览器
  3. Android(安卓)AsyncTask(异步) 简单样例
  4. Activity has leaked window that was or
  5. android stylet
  6. Android(安卓)P系统输出图像镜像翻转实现
  7. 近百android程序源码贡献 转载的自己看的
  8. ImageView设置图片大小
  9. Android应用程序获取ROOT权限的方法 (基础
  10. Android在子线程中更新UI的方法汇总(共七