天天看点

Android4.2 系统服务系列之窗口服务---初始化

窗口管理服务由SystemServer进程启动并管理。下面代码所示:

Slog.i(TAG, "Window Manager");

wm = WindowManagerService.main(context,power, display, inputManager,

                    uiHandler, wmHandler,

                    factoryTest !=SystemServer.FACTORY_TEST_LOW_LEVEL,

                    !firstBoot, onlyCore);

ServiceManager.addService(Context.WINDOW_SERVICE,wm);

这里调用了WindowManagerService的一个名叫main的静态方法来实现窗口管理服务的实例化工作。以下代码为main方法的声明以及实现:

   public static WindowManagerService main(final Context context,

           final PowerManagerService pm, final DisplayManagerService dm,

           final InputManagerService im,

           final Handler uiHandler, final Handler wmHandler,

           final boolean haveInputMethods, final boolean showBootMsgs,

           final boolean onlyCore) {

       final WindowManagerService[] holder = new WindowManagerService[1];

       wmHandler.runWithScissors(new Runnable() {

           @Override

           public void run() {

                holder[0] = newWindowManagerService(context, pm, dm, im,

                        uiHandler,haveInputMethods, showBootMsgs, onlyCore);

           }

       }, 0);

       return holder[0];

}

从窗口管理服务的main方法可以看出,窗口管理服务的初始需要一些必要的条件,这些条件将用于帮助窗口管理服务完成必要的功能(比如:屏幕超时等等)。这些条件它们分别是:

1、  系统上下文(context):系统上下文(context)由ActivityManagerService(Activity管理服务)创建以供“system_server”进程使用。如下代码所示:

Slog.i(TAG,"Activity Manager");

    context =ActivityManagerService.main(factoryTest);

2、  电源管理服务(PowerManagerService):电源管理服务由SystemService实例化并管理:

Slog.i(TAG, "Power Manager");

power =new PowerManagerService();

   ServiceManager.addService(Context.POWER_SERVICE, power);

它的作用是负责协调设备上的电源管理功能。在窗口管理服务的启动以及发挥作用的过程中可以看到其作用。

3、  显示管理服务(DisplayManagerService):显示管理服务同样由SystemService实例化并管理:

Slog.i(TAG, "DisplayManager");

display =new DisplayManagerService(context, wmHandler, uiHandler);

   ServiceManager.addService(Context.DISPLAY_SERVICE, display, true);

从总体上来说,显示管理服务管理全局显示器的生命周期,决策如何配置基于当前的物理显示器的逻辑显示器,当显示器状态发生改变的时候发送给系统和应用程序发送通知等等。

4、  输入管理服务(InputManagerService):输入管理服务同样由SystemService实例化并管理:

Slog.i(TAG,"Input Manager");

inputManager = newInputManagerService(context, wmHandler);

对于窗口来说,不可避免与输入法打交道,这个时候,它就需要输入管理服务来帮助它完成一些管理功能(比如显示输入法之类)。

5、  UI线程的处理器(uiHandler):这个线程处理器由SystemServer所在的进程创建的子线程“UI”的基础上创建:

HandlerThreaduiHandlerThread = new HandlerThread("UI");

uiHandlerThread.start();

HandleruiHandler = new Handler(uiHandlerThread.getLooper());

这个线程用于system_server进程内的UI而创建。

6、  windowManagerService处理器(wmHandler):此处理器也是由system_server进程的“WindowManager”子线程的基础上创建,它只为窗口管理服务服务:

        HandlerThread wmHandlerThread = newHandlerThread("WindowManager");

        wmHandlerThread.start();

        Handler wmHandler = new Handler(wmHandlerThread.getLooper());

以上为WindowManagerService的main方法的输入参数的解释,窗口管理服务也以此为基础开始一系列的工作。

接下来,看看main方法的具体内容:

finalWindowManagerService[] holder = new WindowManagerService[1];

   wmHandler.runWithScissors(new Runnable() {

             @Override

       public void run() {

                holder[0] = newWindowManagerService(context, pm, dm, im,

                     uiHandler,haveInputMethods, showBootMsgs, onlyCore);

       }

    }, 0);

    return holder[0];

这里可以看到system_server创建的处理器起了作用。它往system_server进程中的“WindowManager”子线程抛了一个实例化窗口管理服务的任务。它完成后,system_server就得到了一个窗口管理服务的实例。这个实例将会被用到Activity管理服务中:

ActivityManagerService.self().setWindowManager(wm);

那么现在来看看窗口服务在实例化的过程中都做了些什么:

Android4.2 系统服务系列之窗口服务---初始化

在这里,WindowManagerService完成了一些初始化工作,包括类成员的初始化以及侦听一些窗口关心的广播等等。

在这些初始化工作中相对比较重要的要数窗口规则(Policy)的初始化。WindowManagerService通过调用私有方法“initPolicy”完成:

private voidinitPolicy(Handler uiHandler) {

uiHandler.runWithScissors(new Runnable() {

             @Override

        public void run() {

                 WindowManagerPolicyThread.set(Thread.currentThread(),

                                                                                             Looper.myLooper());

                   mPolicy.init(mContext,

                                WindowManagerService.this,

  WindowManagerService.this);

            mAnimator.mAboveUniverseLayer =mPolicy.getAboveUniverseLayer()

                         * TYPE_LAYER_MULTIPLIER

                        + TYPE_LAYER_OFFSET;

        }

    }, 0);

}

         在这个方法中,“mPolicy.init()”起了关键作用。在窗口管理服务中,mPolicy是这样定义的:

finalWindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();

规则管理器(PolicyManager)通过makeNewWindowManager方法返回了一个“WindowManagerPolicy”的实现,也就是PhoneWindowManager:

首先:PolicyManager实例化了一个Policy的静态实例,将由它来生成规则实例:

         privatestatic final String POLICY_IMPL_CLASS_NAME =

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

         privatestatic final IPolicy sPolicy;

         static{

             Class policyClass =Class.forName(POLICY_IMPL_CLASS_NAME);

             sPolicy = (IPolicy)policyClass.newInstance();

         }

其次,PolicyManager管理器的makeNewWindowManager方法:

        publicstatic WindowManagerPolicy makeNewWindowManager() {

       return sPolicy.makeNewWindowManager();

}

最后,生成窗口规则,也就是PhoneWindowManager:

   public WindowManagerPolicy makeNewWindowManager() {

        return new PhoneWindowManager();

    }

下图为PhoneWindowManager的类图概要:

Android4.2 系统服务系列之窗口服务---初始化

PhoneWindowManager实现了WindowManagerPolicy接口。在WindowManagerPolicy中包含一个init接口用于规则的初始化工作。PhoneWindowManager作为WindowManagerPolicy接口的其中一个实现也不例外。也就是说PhoneWindowManager的init方法完成了PhoneWindowManager的初始化工作。那么下面的代码也就出现了等价关系:

mPolicy.init(…)等价于PhoneWindowManager.init()

init方法完成了下图所示的工作:

Android4.2 系统服务系列之窗口服务---初始化

PhoneWindowManager依赖KeyguardViewMediator管理锁屏界面。KeyguardViewMediator经历了这样的初始化过程:

Android4.2 系统服务系列之窗口服务---初始化

KeyguardViewMediator相当重要,它作为窗口和锁屏之间的介质而存在,也就是说,由它来调度锁屏界面。

KeyguardViewMediator依赖LockPattUtils、KeyguardUpdateMonitor、KeyguardViewManager这三个工具来调度锁屏。下面是它们的初始化过程:

LockPattUtils:

public LockPatternUtils(Context context) {

        mContext = context;

        mContentResolver = context.getContentResolver();

}

KeyguardViewManager:

public KeyguardViewManager(Context context, ViewManager viewManager,

          KeyguardViewMediator.ViewMediatorCallback callback,

            LockPatternUtils lockPatternUtils) {

        mContext = context;

        mViewManager = viewManager;

        mViewMediatorCallback = callback;

        mLockPatternUtils = lockPatternUtils;

}

KeyguardUpdateMonitor:

Android4.2 系统服务系列之窗口服务---初始化

完成了这些初始化工作后,窗口服务就实例化完成并且在system_server中进行管理。它正在等待系统就绪的消息的到来,也是下边将会说明的内容。

下面展示了窗口服务以及上文提及的工具之间的关系:

Android4.2 系统服务系列之窗口服务---初始化

继续阅读