WindowManagerService大概简介

251 阅读2分钟

一、窗口分类

1. ApplicationWindow

应用程序窗口 1~99

2. sub window

子窗口 popupwindow:需要附着在其他的窗口上才可以。 与父窗口公用一个token 1000~1999

3. System window

系统窗口 输入法,系统音量,错误窗口。 2000~2999

二、窗口的flag

有很多,可以去设置

1.脸靠近屏幕不响应点击事件

2.window显示就一直亮

3.可以把事件传递给下一层的win去处理。

三、接口和类的关系

viewManager.java是一个接口,里面有增删改的方法。

windowmanager.java 是一个接口

windowManagerImpl.java是实现类

window实现了windowmanager,他是一个抽象类

phoneWindow是window的唯一实现类。

桥接模式,用上层进行关联。(window和windowmanager进行关联。抽象类相互关联,实现类独立发展) 降低了window和phoneWindow之间的耦合。(recycle和layoutmanager)

image.png

四、WindowManagerGloble

主要作用,对Decoreview、view里的参数LayoutParams和ViewRootImpl的管理

image.png

五、ViewRootImpl

  1. view树的树根并管理view树

  2. 触发view的测量、布局、绘制

  3. 输入响应的中转站

  4. 负责与WMS进行进程间通信

perfromTraversales()进行整个View树的绘制流程。(接收同步信号,才开始执行)

六、事件分发

DecordView收到事件后会先分发给Activity.

image.png

七、更新window

image.png

八、SurfaceFlinger

SF是整个android渲染的核心进程。所有应用的渲染逻辑都会来到SF中去处理,最终会把处理后的图像数据交给CPU或GPU.

九、wms的功能

负责窗口的添加删除,动画

十、WMS的属性

  1. mPolicy:windowmanagerPolicy是窗口管理类的接口类,用来定义一个窗口策略索要遵循的通用规范,并提供了WindowManager所有的特定的UI行为(具体实现:PhoneWindowManager,窗口检查会用到这个类,里面有splashScreen,window进行排序)

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

  3. mWindowMap:WindowHashMap 用来保存WMS中的各种window的集合。(应用层是Window ,WMS里是window State)

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

  5. mAnimator:WindowAnimator 用来观理窗口的动画及特效动画

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

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

十一、windowState的类关系

windowState 会被放置到windowToken(一组窗口,聚合)中

DisPlayContent可以理解成对应一块屏幕。

image.png

十二、事件分发

EventHub去读取相关的事件,InputReader读取EventHub里的事件,然后把事件推送给InputDispatch线程, InputDisPatch线程把时间派发给InputManagerService.根据里面的管道通过socket把实践发送给对应的窗口viewRootImpl. image.png