窗口管理服务由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中进行管理。它正在等待系统就绪的消息的到来,也是下边将会说明的内容。
下面展示了窗口服务以及上文提及的工具之间的关系: