首先我们了解一下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->事件分发。