WMS(WindowManagerService)分析

首先我们了解一下WMS是什么。

1、窗口管理

WSM是窗口的管理者,它负责窗口的启动、添加、删除。另外窗口的层级、大小也是由WMS进行管理的。

2、窗口动画

窗口进行切换时,使用动画可以显得更丝滑一些,窗口动画由WMS的动画子系统来负责,动画子系统的管理者为WindowAnimatior。

3、输入系统中转站

通过对窗口的触摸从而产生触摸事件,InputManagerService(IMS),会对触摸事件进行处理,它会寻找一个最合适的窗口来处理反馈信息,WMS是窗口的管理者,它作为输入系统的中转站再合适不过。

4、Surface的管理

窗口不具备绘制功能,因此每个窗口都需要一块Surface来供自己绘制,为每个窗口分配Surface是由WMS来完成的。

WMS的重要成员

1、mPolicy:WindowManagerPolicy

WMP是窗口管理策略的接口类,用来定义一个窗口策略索要遵循的通用规范,并提供了WM所有的特定的UI的行为。它的具体实现类是PhoneWindowManager,这个实现类在WMS创建时被创建

2、mSession:ArraySet<Session>

ArraySet类型的变量,元素类型为Session。它主要用于进程间通信,其他的应用程序斤想要和WMS进程进行通讯就需要经过Session,并且每个应用程序进程都会对应一个Sessin,WMS保存着Session用来记录所有向WMS提出窗口管理服务的客户端。

3、mWindowMap:WindowHashMap

WindowHashMap类型的变量,WindowHashMap继承了HashMap,它限制了HashMap的key的类型为IBinder,value值的类型为WindowState。WindowState用于保存窗口的信息,在WMS中它用来描述一个窗口。综上得出结论,mWindowMap就是用来保存WMS中各种窗口的集合。

4、mFinishedStarting:ArrayList<AppWindowToken>

ArrayList类型的变量,元素类型为AppWindowToken,它是WindowToken的子类。想要理解mFinishedStarting的含义,需要先了解WindowState是什么

WindowToken:

        1)定义:可以理解为窗口令牌,当应用程序想要向WMS申请新创建一个窗口,则需要向WMS出示有效的WindowToken。AppWindowToken作为WindowToken的子类,主要用来描述应用程序的。

        2)WindowToken结构:应用程序中每个Activity都对应一个AppWindowToken,WindowToken会将相同组件(比如Activity)的窗口(WindowState)集合在一起,方便管理。

WindowState:

        WindowState标识一个窗口的所有属性,且存在于WMS端,所以它是WMS中的一个事实窗口。App端的一个Window,在WMS中就会对应一个WindowState。

5、mResizingWindows:ArrayList<WindowState>

        ArrayList类型的变量,元素类型为WindowState。mResizingWindows是用来存储正在调整大小的窗口列表。

6、mInuputManager:InputManagerService

        InputManagerService类型的变量,输入系统的管理者。IMS会对触摸事件进行处理,它会寻找一个最合适的窗口了处理触摸反馈信息,WMS是窗口的管理者,因此WMS也就成为了输入系统的中转站。

WMS的启动:

 WMS添加window:

在这之前呢,我们看一下WindowToken、WindowState、DisContent之间的关系

 

WMS添加窗口后通过surface绘制

 

创建了surface之后,接着就是我们的涂层layer了:

 

 整体流程是这样的:

生成渲染涂层->给涂层渲染->放入渲染后的涂层队列->从队列中取出渲染后的涂层->生成图形数据。

 事件输入原理和事件分发:

大致流程:硬件监听到输入事件->InputReader线程读取->转给WMS的InputDispatcher线程派发->InputManagerService接收后->通过Socket传给应用层->应用层接收后经过事件处理->传给DecorView->事件分发。

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值