zoukankan      html  css  js  c++  java
  • 理解WindowManagerService

    --摘自《Android进阶解密》

    *WMS的职责*

    1)窗口管理  WMS负责窗口的启动、添加和删除,另外窗口的大小和层级也是由WMS进行管理的

    2)窗口动画  WMS的动画子系统WindowAnimator负责窗口间的切换动画

    3)输入系统的中转站  InputManagerService会对触摸事件进行处理,寻找最合适的窗口来处理触摸反馈信息

    4)Surface管理  WMS为每个窗口分配Surface来供自己绘制

    *WMS的创建工程*

    WMS是在SystemServer进程中创建的

    上面三个线程实现三个步骤

    1)首先在system_server线程中执行了SystemServer的startOtherServices方法,在startOtherServices方法中会调用WMS的main方法,main方法会创建WMS,创建的过程咋iandroid.display线程中实现,创建WMS的优先级更高,因此system_server线程要等WMS创建完成后,处于等待状态的system_server线程才会被唤醒从而继续执行下面的代码

    2)在WMS的构造方法中会调用WMS的initPolicy方法,在initPolicy方法中又会调用PWM的init方法,PWM的init方法在android.ui线程中运行,它的优先级要高于android.display线程,因此“android.display”线程要等PWM的init方法执行完毕后,处于等待状态的android.display线程才会被唤醒从而继续执行下面的代码

    3)PWM的init方法执行完毕后,android.display线程就完成了WMS的创建,等待的system_server线程被唤醒后继续执行WMS的main方法后的代码逻辑,比如WMS的displayReady方法用来初始化屏幕显示信息

    知识点:

    1)Watchdog用来监控系统的一些关键服务的运行状况

    *WMS的重要成员*

    1.mPolicy:WindowManagerPolicy  是窗口管理策略的接口类,用来定义一个窗口策略所要遵循的通用规范,并提供了WindowManager所有的特定的UI行为

    2.mSessions:ArraySet  主要用于进程间通信,其他的应用程序进程想要和WMS进程进行通信就需要经过Session,并且每个应用程序进程都会对应一个Session

    3.mWindowMap:WindowHashMap  用来保存WMS中各种窗口的集合

    4.mFinishedStarting:ArrayList  用于存储已经完成启动的应用程序窗口(比如Activity)的AppWindowToken的列表

    5.mResizingWindows:ArrayList  用来存储正在调整大小的窗口的列表

    6.mAnimator:WindowAnimator  用于管理窗口的动画以及特效动画

    7.mH:H  用来将任务加入到主线程的消息队列中

    8.mInputManager:InputManagerService  输入系统的管理者

    *Window的添加过程(WMS处理部分)*

    WindowToken可以理解为窗口令牌,且会将一个组件(比如同一个Activity)的窗口(WindowState)集合在一起,方便管理

    主要是以下4件事

    1)对所要添加的窗口进行检查,如果窗口不满足一些条件,就不会再执行下面的代码逻辑

    2)WindowToken相关的处理,比如有的窗口类型需要提供WindowToken,没有提供的话就不会执行下面的代码逻辑,有的窗口类型则需要由WMS隐式创建WindowToken

    3)WindowState的创建和相关处理,将WindowToken和WindowState相关联

    4)创建和配置DisplayContent,完成窗口添加到系统前的准备工作

    *Window的删除过程*

    要删除Window需要先调用WindowManagerImpl的removeView方法,在removeView方法中又会调用WindowManagerGlobal的removeView方法

    主要是以下4件事

    1)检查删除线程的正确性,如果不正确就抛出异常(因为只有创建Window的原始线程才能够操作Window)

    2)从ViewRootImpl列表、布局参数列表和View列表中删除与Window对应的元素

    3)判断是否可以直接执行删除操作,如果不能就推迟删除操作(比如Window正在运行一个动画)

    4)执行删除操作,清理和释放与Window相关的一切资源

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

  • 相关阅读:
    三,遍历方法 1$.each(数组/对象,function处理); //$对象 调用的 2$(选择器).each(function处理); //jquery对象 调用的
    二,jquery对象 与 dom对象关系
    一,$符号的由来
    2高级js总结-------数组
    面试归来
    Http(Tcp/IP)通信建立中的三次握手
    类似于桌面启动器
    代码写Android应用的背景颜色
    靠谱的a与b互换
    day21-类的组合
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10187042.html
Copyright © 2011-2022 走看看