美文网首页
Window,WindowManager和WMS

Window,WindowManager和WMS

作者: 慎独静思 | 来源:发表于2022-02-23 00:05 被阅读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进阶解密》

    相关文章

      网友评论

          本文标题:Window,WindowManager和WMS

          本文链接:https://www.haomeiwen.com/subject/vhewlrtx.html