視窗管理服務由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);
那麼現在來看看視窗服務在執行個體化的過程中都做了些什麼:

在這裡,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的類圖概要:
PhoneWindowManager實作了WindowManagerPolicy接口。在WindowManagerPolicy中包含一個init接口用于規則的初始化工作。PhoneWindowManager作為WindowManagerPolicy接口的其中一個實作也不例外。也就是說PhoneWindowManager的init方法完成了PhoneWindowManager的初始化工作。那麼下面的代碼也就出現了等價關系:
mPolicy.init(…)等價于PhoneWindowManager.init()
init方法完成了下圖所示的工作:
PhoneWindowManager依賴KeyguardViewMediator管理鎖屏界面。KeyguardViewMediator經曆了這樣的初始化過程:
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:
完成了這些初始化工作後,視窗服務就執行個體化完成并且在system_server中進行管理。它正在等待系統就緒的消息的到來,也是下邊将會說明的内容。
下面展示了視窗服務以及上文提及的工具之間的關系: