一、窗口分类
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)
四、WindowManagerGloble
主要作用,对Decoreview、view里的参数LayoutParams和ViewRootImpl的管理
五、ViewRootImpl
-
view树的树根并管理view树
-
触发view的测量、布局、绘制
-
输入响应的中转站
-
负责与WMS进行进程间通信
perfromTraversales()进行整个View树的绘制流程。(接收同步信号,才开始执行)
六、事件分发
DecordView收到事件后会先分发给Activity.
七、更新window
八、SurfaceFlinger
SF是整个android渲染的核心进程。所有应用的渲染逻辑都会来到SF中去处理,最终会把处理后的图像数据交给CPU或GPU.
九、wms的功能
负责窗口的添加删除,动画
十、WMS的属性
-
mPolicy:windowmanagerPolicy是窗口管理类的接口类,用来定义一个窗口策略索要遵循的通用规范,并提供了WindowManager所有的特定的UI行为(具体实现:PhoneWindowManager,窗口检查会用到这个类,里面有splashScreen,window进行排序)
-
mSessions:ArraySet 主要用于进程间通信,其它的应用程序进程想要和WMS进程进行通信就需要经过Session,每个应用程序进程都会有一个Session
-
mWindowMap:WindowHashMap 用来保存WMS中的各种window的集合。(应用层是Window ,WMS里是window State)
-
mResizingWindows:ArrayList 用来存储正在调整大小的窗口列表。
-
mAnimator:WindowAnimator 用来观理窗口的动画及特效动画
-
mH: 用来将任务加入到主线程的消息队列中。
-
mInputManager:InputManagerService 输入系统的管理者
十一、windowState的类关系
windowState 会被放置到windowToken(一组窗口,聚合)中
DisPlayContent可以理解成对应一块屏幕。
十二、事件分发
EventHub去读取相关的事件,InputReader读取EventHub里的事件,然后把事件推送给InputDispatch线程,
InputDisPatch线程把时间派发给InputManagerService.根据里面的管道通过socket把实践发送给对应的窗口viewRootImpl.