一、概述
Android系统窗口管理是由WindowManagerService负责实现的.WindowManagerService(后面简称WMS)的代码位于
frameworks/base/services/java/com/android/server/wm/WindowManagerService.java.
什么是窗口?
窗口就是屏幕上的一块矩形区域,可以显示UI和与用户交互.常见的比如:Dialog,Activity界面,状态栏、Toast界面.站在系统的角度来说,
窗口其实是一个Surface(画布).一个屏幕有多个窗口,而这多个窗口的布局和顺序以及窗口动画是由WMS管理的,然后由一个叫SurfaceFlinger的服务来对多个画布内容混合和显示出来.
WMS和SurfaceFlinger的关系如下图
图中的Z轴大小就是不同窗口显示的顺序,在Android里叫Z-order.SurfaceFlinger将多块Surface的内容按照Z-order进行混合并输出到FrameBuffer(帧缓冲).
二、WMS的启动
和AMS、PMS一样,WMS也是在SystemServer的initAndLoop方法里启动的.
主要有3个阶段:
1.创建WMS
2.做显示准备工作
3.SystemServer启动之后通知WMS
先看第一个阶段
1.创建WMS
wm = WindowManagerService.main(context, power, display, inputManager, wmHandler, factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL, !firstBoot, onlyCore);
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
新建WMS实例,然后往ServiceManager注册WMS.
看下main方法
public static WindowManagerService main(final Context context, final PowerManagerService pm, final DisplayManagerService dm, final InputManagerService im, final Handler wmHandler, final boolean haveInputMethods, final boolean showBootMsgs, final boolean onlyCore) {
final WindowManagerService[] holder = new WindowManagerService[1];
wmHandler.runWithScissors(new Runnable() {