Window的添加过程的WMS部分,将addWindow方法分为了3个部分来进行讲解,从addWindow方法我们得知WMS有3个重要的类分别是WindowToken、WindowState和DisplayContent
启动过程
1.1 WindowManagerService 的诞生
1.1.1 在 SystemServer 中的创建
WMS 是在 SystemServer 进程中启动的,SystemServer 进程是 Android 系统启动的时候初始化的,我们首先来看一下 SystemServer 的入口函数 main()
public final class SystemServer {
/**
* The main entry point from zygote.
*/
public static void main(String[] args) {
new SystemServer().run();
}
}
分析run方法
private void run() {
......
mSystemServiceManager = new SystemServiceManager(mSystemContext); // 代码 1
// Start services.
try {
traceBeginAndSlog("StartServices");
startBootstrapServices(); // 代码 2
startCoreServices(); // 代码 3
startOtherServices(); // 代码 4
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
}
代码1处,创建了一个 SystemServiceManager 对象
代码2处,调用 startBootstrapServices() 启动 ActivityManagerService、PackageManagerService 等服务进程
代码3处,调用 startCoreServices() 启动BatteryService、WebViewUpdateService 等服务进程
代码4处,调用 startOtherServices() 启动 WindowManagerService、InputManagerService 等服务进程
二. WMS 与 WindowManager 的通信
在上篇文章 初步理解 Window 体系 中,我们最后分析到了 ViewRootImpl,ViewRootImpl 是连接 WindowManager 和 WMS 的桥梁,自然他们之间的通信也是通过 ViewRootImpl 完成的。
2.1 ViewRootImpl 的成员变量
在 ViewRootImpl 中有两个个非常重要的成员变量:mWindowSession 和 mWindow,这两个变量都是用于 ViewRootImpl 和 WMS 通信使用的
public final class ViewRootImpl implements ViewParent,
View.AttachInfo.Callbacks, ThreadedRenderer.DrawCallbacks {
......
final IWindowSession mWindowSession;
final W mWindow;<