Window,WindowManager和WMS
WindowManager用来管理window,它提供的功能会有WMS进行处理。WindowManager和WMS通过Binder进行跨进程通信,类似ActivityManager和AMS。
通过Context的getSystemService(Context.WINDOW_SERVICE)拿到的其实是WindowManagerImpl的实例。
WindowManagerImpl没实现什么功能,而是把实现委托给了WindowManagerGlobal,这里用到的是桥接模式。
public final class WindowManagerImpl implements WindowManager {
private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
private final Context mContext;
private final Window mParentWindow;
private IBinder mDefaultToken;
public WindowManagerImpl(Context context) {
this(context, null);
}
private WindowManagerImpl(Context context, Window parentWindow) {
mContext = context;
mParentWindow = parentWindow;
}
...
}
WindowManagerGlobal是单例的,说明在一个进程中只有一个实例。
Window的类型
Window的类型是在WindowManager.LayoutParams中定义的type。
Window分为三大类,应用程序窗口,子窗口,系统窗口。
应用程序窗口type值范围是1~99,type的大小涉及窗口的层级。
子窗口不能独立存在,需要附着在其他窗口才可以,type值范围为1000~1999。
系统窗口type值范围为2000~2999。
WMS确定窗口的显示次序更加屏幕上的Z轴,Z轴从屏幕内指向屏幕外,称为Z-Order。一般情况下,type越大,Z-Order排序越靠前,就越靠近用户。
Window的标志
软键盘相关模式
softInputMode和AndroidManifest中Activity的属性android:windowSoftInputMode是对应的。
WindowManager窗口处理操作
窗口添加过程从这个过程中我们发现,ViewRootImpl是在WindowManagerGlobal中创建的。
ViewRootImpl的主要职责有以下几点:
1.View树的根并管理View树
2.触发view的布局,测量和绘制
3.输入事件的中转站
4.管理surface
5.负责与WMS进行进程间通信
窗口是以View形式存在的,WindowManagerGlobal中保存了新创建窗口的ViewRootImlp,Param和View。
负责界面绘制的是surface,不是窗口本身,Surface由SurfaceFlinger处理。
参考:
《Android进阶解密》