天天看點

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 系統服務系列之視窗服務---初始化

繼續閱讀