三者层级关系
1、Window
- Window是一个抽象类,唯一的实现类是PhoneWindow
- Window分为三种类型应用Window、子Window、系统Window。子Window无法独立存在必须依赖父级Window,例如Dialog必须依附于Activity
- Window分层,在显示时层级高的窗口会覆盖在在层级低的窗口
类型 | 层级(z-ordered) | 例子 |
---|---|---|
应用 Window | 1~99 | Activity |
子 Window | 1000~1999 | Dialog |
系统 Window | 2000~2999 | Toast |
2、WindowManager
- WindowManager是Window的管理者,WindowManager是一个接口它的实现类是WindowMangerImpl
- WindowManager只提供是对View的add、update、remove操作
- WindowManager的addView()方法最终会创建新的ViewRootImpl而addContentView()直接把View添加到DecorView上
3、WindowManagerGlobal
-
WindowManagerGlobal是单例模式,进程唯一
-
WindowManager的add、update、remove操作最终会调用WindowManagerGlobal的方法
-
WindowManagerGlobal下管理了4个List
ArrayList<View> mViews; //——所有Window的根View
ArrayList<ViewRootImpl> mRoots; //所有根View对应的ViewRootImpl
ArrayList<WindowManager.LayoutParams> mParams; //所有根View(Window)对应的布局参数
ArraySet<View> mDyingViews; //待销毁的根View(Window)
- WindowManagerGlobal负责对ViewRootImpl进行统一管理,而具体实现是在ViewRootImpl中
4、ViewRootImpl
关系图
- 一个Window(PhoneWindow)可能存在多个ViewRootImpl链,所以需要一个Window将所有链管理起来
- WindowManager.addView()调用WindowManagerGlobal.addView(),最终在WindowManagerGlobal.addView()方法中创建RootViewImpl
//WindowManagerGlobal.addView()
public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow, int userId) {
//检查参数是否合法
if (view == null) {
throw new IllegalArgumentException("view must not be null");
}
if (display == null) {
throw new IllegalArgumentException("display must not be null");
}
if (!(params instanceof WindowManager.