• 理解WidowManager


    --摘自《Android进阶解密》

    *WindowManger的关联类*

    1.Window是一个抽象类,具体的实现类为PhoneWindow,它对View进行管理。WindowManager是一个接口类,继承自接口ViewManager,ViewManager是用来管理Window的,它的实现类为WindowManagerImpl。

    2.想要对Windo(View)进行添加、更新和删除操作就可以使用WindowManager,WindowManager会将具体的工作交由WMS来处理,WindowManager和WMS通过Binder来进行跨进程通信,WMS作为系统服务有很多API是不会暴露给WindowManager的

    3.Window是以View的形式存在的

    4.PhoneWindow是在Activity启动过程中的attach方法中创建的

    5.WindowManagerImpl虽然是WindowManger的实现类,但是没有实现什么功能,而是将功能实现委托给了WindowManagerGlobal,这里用到的是桥接模式

    6.PhoneWindow继承自Window,Window通过serWindowManager方法与WindowManager发生关联。WindowManager继承自接口ViewManager,WindowManagerImpl是WindowManager接口的实现类,但是具体的功能都会委托给WindowManagerGlobal来实现

    *Window的属性*

    1.Type-Window的类型

      1)应用程序窗口-Application Window  Type值范围 1~99

      2)子窗口-Sub Window  Type值范围 1000~1999

      3)系统窗口-System Window  Type值范围 2000~2999

    Type值越大则Z轴排序越靠前,就越靠近用户

    2.Window标志-Flag

    设置Window的Flag的3种方法

    Window mWindow = getWindow();
    mWindow.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    Window mWindow = getWindow();
    mWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREE
    
    WindowManager.LayoutParams mWindowLayoutParams = new WindowManager.LayoutParams();
    mWindowLayoutParams.flags=WindowManager.LayoutParams.FLAG_FULLSCREEN;
    WindowManager mWindowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
    TextView mTextView = new TextView(this);
    mWindowManager.addView(mTextView,mWindowLayoutParams);

    3. 软键盘相关模式

    *Window的操作*

    1.系统窗口StatusBar的添加过程

    1)ViewRootImpl的主要职责

      * View树的根并管理View树

      * 触发View的测量、布局和绘制

      * 输入事件的中转站

      * 管理Surface

      * 负责与WMS进行进程间通信

    2)mWindowSession是IWindowSession类型的,它是一个Binder对象,用于进行进程间通信,IWindowSession是Client端的代理,它的Server端的实现为Session,此前的代码逻辑都是运行在本地进程的,而Session的addToDisplay方法则运行在WMS所在的进程(SystemServer进程)中

    3)WMS中会为添加的窗口分配Surface,并确定窗口显示次序,可见负责显示界面的是画布Surface,而不是窗口本身。WMS会将它所管理的Surface交由SurfaceFlinger处理,SurfaceFlinger会将这些Surface混合并绘制到屏幕上

    4)Window的更新需要调用ViewManager的updateViewLayout方法,updateViewLayout方法在WindowManagerImpl中实现,然后会调用WindowManagerGlobal的updateViewLayout方法

    欢迎关注我的微信公众号:安卓圈

  • 相关阅读:
    Java修改excel内容
    text标签onchang事件
    shh将数据导出excel
    正则表达式0到200以内的数
    虚拟内存与物理内存
    捕获内核的异常事件
    linux内存(三)内核与用户空间交互
    linux内存(二)高端内存
    linux内存(一) 内核空间与用户空间
    使用tc配置后端设备,来限制虚拟机网卡带宽
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10186291.html
Copyright © 2020-2023  润新知