• 理解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方法

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

  • 相关阅读:
    Spring之Condition(二)在哪里解析的
    SpringBoot启动跟代码过程
    Spring之Condition(一)
    Kafka之 vm.max_map_count
    Redis常见面试题
    Redis为什么快
    TCP一个包多大
    场景问题
    这是一个测试
    小程序-使用django-drf开接口的步骤
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10186291.html
Copyright © 2020-2023  润新知