歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android Framework中的PolicyManager簡介

Android Framework中的PolicyManager簡介

日期:2017/3/1 10:30:26   编辑:Linux編程

PolicyManager類位於framework\base\core\java\com\Android\internal\policy目錄中的PolicyManager.java文件中。PolicyManager主要用於創建Window類、LayoutInflater類和WindowManagerPolicy類,它扮演著簡單工廠模式中的工廠類角色,而抽象產品角色由IPolicy接口實現,具體產品角色由Policy類實現。它們的關系如下圖所示:


從下面三個類的代碼可以看出,都使用了hide注解,因此,這三個類都是不對外公開的API,只限於Framework內部使用。

抽象產品類IPolicy實現如下(IPolicy.java):

[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):

[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):

[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. }
Copyright © Linux教程網 All Rights Reserved