它是framework层的窗口管理服务,职责是管理android系统中所有的window。其中包含了添加窗口、删除窗口、token管理、输入法管理、系统事件消息收集和分发、活动窗口管理(FocusWindow)、活动应用管理(FocusApp)、转场动画。
如有需要完整的 Android Framework 学习内容 请在文章末尾处免费领取
WMS和AMS一样,都出通过SystemService来进行启动的。
SystemService–>startOtherService()
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
WindowManagerService–>main()
WMS的创建过程伴随着线程切换的过程。线程切换如下:
SystemServer线程 --> DisplayThread线程
在android中,普通的handle.post 是异步机制的的(发送消息后,继续执行下面的代码,然后在onHandlerMessage中收到消息后再去执行其他代码)。
而上面main方法中使用runWithScissors却是同步的,先执行消息中的代码,然后再执行handler.post之后的代码。
runWithScissors实现同步的原理是线程锁定,阻塞等待handler执行完成。代码如下:
public final boolean runWithScissors(@NonNull Runnable r, long timeout) {
if (r == null) {
throw new IllegalArgumentException("runnable must not be null");
}
if (timeout < 0) {
throw new IllegalArgumentException("timeout must be non-negative");
}
if (Looper.myLooper() == mLooper) {
r.run();
return true;
}
BlockingRunnable br = new BlockingRunnable(r);
return br.postAndWait(this, timeout);
}
BlockingRunnable中的Run方法:
@Override
public void run() {
try {
mTask.run();
} finally {
synchronized (this) {
mDone = true;
//唤醒下面的wait
notifyAll();
}
}
}
postAndWait方法代码如下:
public boolean postAndWait(Handler handler, long timeout) {
if (!handler.post(this)) {
//消息发送失败直接返回false,不进行锁定
return false;
}
synchronized (this) {
if (timeout > 0) {
final long expirationTime = SystemClock.uptimeMillis() + timeout;
//开启循环,
while (!mDone) {
long delay = expirationTime - SystemClock.uptimeMillis();
if (delay <= 0) {
return false; // timeout
}
try {
//等待,上面执行完成之后会进行notifyAll唤醒
wait(delay);
} catch (InterruptedException ex) {
}
}
} else {
while (!mDone) {
try {
//等待,上面执行完成之后会进行notifyAll唤醒
wait();
} catch (InterruptedException ex) {
}
}
}
}
return true;
}
WMS启动完成之后在SystemServer中继续往下执行,将WMS和AMS绑定。
mActivityManagerService.setWindowManager(wm);
调用WMS中的onInitReady接口。
wm.onInitReady();–> initPolicy()–>UIThread.getHandler.runWithScissors()
继续往下,调用displayReady方法,初始化显示尺寸信息。
try {
wm.displayReady();
} catch (Throwable e) {
reportWtf("making display ready", e);
}
继续往下:调用wms中的systemReady方法。
try {
wm.systemReady();
} catch (Throwable e) {
reportWtf("making Window Manager Service ready", e);
}
如有需要 Android Framework 的完整学习内容 请点击免费领取
以上就是wms的启动流程,总结一下流程:
WMS的启动涉及三个线程:SystemServer线程、DisplayThread线程,UIThread。
其中创建WMS的线程是在DisplayThread线程中进行的。因为SystemServer负责的管理、启动的服务很多,而wms是管理所有窗口、负责显示相关的服务,也是用户能够明显感知到的,所以不太适合放在systemServer线程当中去初始化,因此才从使用DisplayThread线程去进行创建WMS。