Window是一个抽象类,它的具体实现是PhoneWindow;
public abstract class Window {}
public class PhoneWindow extends Window implements MenuBuilder.Callback {}
Window有三种类型:应用Window、子Window和系统Window。
可以设置WindowManager.LayoutParams.type这个参数。
应用类Window对应一个Activity。子Window不能单独存在,它需要附属在特定的父Window中。常见的一写Dialog就是一个子Window。系统Window是需要声明权限才能创建Window。比如Toast是系统Window。
Window是分层的,每个类型的Window对应不同的层级。
应用Window的层级范围是1~99;子Window的层级范围是1000~1999;系统Window的层级范围是2000~2999;
系统Window的层级是最大的。一般我们可以选用TYPE_SYSTEM_OVERLAY或者TYPE_SYSTEM_ERROR,
可以采用设置type参数 mLayoutParams.type=LayoutParams.TYPE_SYSTEM_ERROR;同时声明权限:
WindowManager有常用的三个方法:添加View、更新View和删除View。这个三个方法定义在了ViewManager中。
WindowManager是一个接口 继承了ViewManager;
public interface WindowManager extends ViewManager{}
public interface ViewManager {
void addView(View var1, LayoutParams var2);
void updateViewLayout(View var1, LayoutParams var2);
void removeView(View var1);
}
Window的添加过程需要通过WindowManager的addView来实现。
WindowManager是一个接口,它的真正实现是WindowManagerImpl类。在WindowManagerImpl中三个方法的主要代码:
private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
@Override
public void addView(View view, ViewGroup.LayoutParams params) {
mGlobal.addView(view, params, mDisplay, mParentWindow);
}
@Override
public void updateViewLayout(View view, ViewGroup.LayoutParams params) {
mGlobal.updateViewLayout(view, params);
}
@Override
public void removeView(View view) {
mGlobal.removeView(view, false);
}
可以看出WindowManagerImpl并没有直接实现这三个方法,而是交给了WindowManagerGlobal来处理。而从WindowManagerGlobal中的三个方法里都是通过ViewRootimpl类来具体实现的。