Window,WindowManager和WMS

2022-02-23  本文已影响0人  慎独静思
三者关系图

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进阶解密》

上一篇下一篇

猜你喜欢

热点阅读