理解 windowmanagerservice

相关概念

Window

是一个抽象类,唯一的实现类是 PhoneWindow

分类:

  1. 父 Window

  2. 子 Window,不能单独存在,需要依附在父 window 上,例如 dialog

  3. 系统 Window,例如 toast

PhoneWindow

在 Activity attach 时构造了 PhoneWindow 的实例对象。

WindowManager

是一个接口,用于操作 Window,继承了 ViewManager。实现类是 WindowManagerImpl

ViewManager 的方法:

1
2
3
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);

可以看到三个操作方法都是针对 View 的,View 是 Window 的实体类

WindowManagerImpl

没有直接操作 View,而是交个了 mGlobal(WindowManagerGlobal)

1
2
3
4
5
 @Override
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
applyDefaultToken(params);
mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
}

WindowManagerGlobal

保存了所有的 ViewRootImpl,在 addView 时会创建 ViewRootImpl 实例,并将要 add 的 View 设置给 ViewRootImpl(见源码 1.1)

View 的绘制过程是由 ViewRootImpl 来完成的。在新建一个 Activity 时,这个要 add 的 View 就是 DecorView。

IWindowSession

(AIDL)窗口令牌,描述了一个显示行为,并且WMS要求每一个窗口必须隶属于某一个显示令牌。

WindowState

当向WMS添加一个窗口时,WMS会为其创建一个WindowState。

WindowManagerService(WMS)

WMS为所有窗口分配Surface,掌管Surface的显示顺序(Z-order)以及位置尺寸,控制窗口动画,并且还是输入系统的一重要的中转站。

Window 体系图

源码

1.1

1
2
3
4
5
6
7
8
9
10
11
//WindowManagerGlobal 

private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();

public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow) {
ViewRootImpl root;
root = new ViewRootImpl(view.getContext(), display);
mRoots.add(root);
root.setView(view, wparams, panelParentView);
}

参考

Android 带你彻底理解 Window 和 WindowManager

深入理解WindowManagerService

WindowManagerService 分析