WMS(WindowManagerService)相关概念
window:它是一个抽象类,具体实现类为 PhoneWindow ,它对 View 进行管理。Window是View的容器,View是Window的具体表现内容;
windowManager:是一个接口类,继承自接口
ViewManager
,从它的名称就知道它是用来管理 Window 的,它的实现类为 WindowManagerImpl;
WMS:是窗口的管理者,它负责窗口的启动、添加和删除。另外窗口的大小和层级也是由它进行管理的;
三者之间的关系:
Window
Window分类
1.Application Window(应用窗口):例如Activity,Dialog;【取值范围为199】1999】;
2.Sub Window(子窗口):不能独立存在,需要依附在其他窗口,例如PopupWindow【取值范围为1000
3.System Window(系统窗口):例如Toast、输入法窗口、系统音量条窗口、系统错误窗口等【2000~2999】;
Window显示层级
窗口相关标志
1.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON(当Window可见时允许锁屏)
2.FLAG_NOT_FOCUSABLE(Window 不能获得输入焦点,即不接受任何按键或按钮事件,例如该 Window 上 有 EditView,点击 EditView 是 不会弹出软键盘的,Window 范围外的事件依旧为原窗口处理;例如点击该窗口外的view,依然会有响应。另外只要设置了此Flag,都将会启用FLAG_NOT_TOUCH_MODAL)
3.FLAG_NOT_TOUCH_MODAL(设置了该 Flag,将 Window 之外的按键事件发送给后面的 Window 处理, 而自己只会处理 Window 区域内的触摸事件;Window 之外的 view 也是可以响应 touch 事件。
)
4.FLAG_NOT_TOUCHABLE(设置了该Flag,表示该 Window 将不会接受任何 touch 事件,例如点击该 Window 不会有响应,只会传给下面有聚焦的窗口)
5.FLAG_KEEP_SCREEN_ON(只要 Window 可见时屏幕就会一直亮着,视频播放、游戏)
6.FLAG_LAYOUT_NO_LIMITS(允许 Window 超过屏幕之外)
7.FLAG_IGNORE_CHEEK_PRESSES(当用户的脸贴近屏幕时(比如打电话),不会去响应此事件 )
8. FLAG_SHOW_WHEN_LOCKED(当用户的脸贴近屏幕时(比如打电话),不会去响应此事件 9.FLAG_IGNORE_CHEEK_PRESSES ; 窗口可以在锁屏的 Window 之上显示, 使用 Activity#setShowWhenLocked(boolean) 方法代替)
WindowManager
在了解WindowManager管理View实现之前,先了解下WindowManager相关类图以及Activity界面各层级显示关系;
addView实现流程
removeView流程
重要类简介:
WindowManagerImpl:WindowManager的唯一实现类;
WindowManagerGlobal:窗口管理操作,所有Activity都是通过这个进程内唯一的WindowManagerGlobal对象和WMS通信;
ViewRootImpl:
1.View树的树根并管理View树;
2.触发View的测量、布局以及绘制;
3.输入相应的中转站;
4.负责与WMS进行进程间通信;
TextView.setText刷新流程
ViewRootImpl会调用scheduleTraversals准备重绘,但是,重绘一般不会立即执行,而是往Choreographer的Choreographer.CALLBACK_TRAVERSAL队列中添加了一个mTraversalRunnable,同时申请VSYNC,这个mTraversalRunnable要一直等到申请的VSYNC到来后才会被执行;
小结
android一般60fps,是VSYNC信号决定的,【每16ms刷新一帧(连续调用setText只会触发一次重绘)】,VSYNC信号要客户端主动申请,才会有VSYNC刷新,UI没更改,不会请求VSYNC信号进行刷新;下一篇将会介绍WMS关于输入事件的分发流程Android WMS工作原理浅析(二)
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )
版权归原作者 一个奔跑的人 所有, 如有侵权,请联系我们删除。