Android WMS工作原理浅析(一)

WMS(WindowManagerService)相关概念

window:它是一个抽象类,具体实现类为 PhoneWindow ,它对 View 进行管理。Window是View的容器,View是Window的具体表现内容;
windowManager:是一个接口类,继承自接口 ViewManager ,从它的名称就知道它是用来管理 Window 的,它的实现类为 WindowManagerImpl;
WMS:是窗口的管理者,它负责窗口的启动、添加和删除。另外窗口的大小和层级也是由它进行管理的;
三者之间的关系
关系图示

Window

Window分类

1.Application Window(应用窗口):例如Activity,Dialog;【取值范围为1~99】
2.Sub Window(子窗口):不能独立存在,需要依附在其他窗口,例如PopupWindow【取值范围为1000~1999】;
3.System Window(系统窗口):例如Toast、输入法窗口、系统音量条窗口、系统错误窗口等【2000~2999】;

Window显示层级

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界面各层级显示关系;
WindowManager相关类图
Activity、phoneWindow、DecorView层级关系

addView实现流程

addView流程

removeView流程

removeView流程

重要类简介:
WindowManagerImpl:WindowManager的唯一实现类;
WindowManagerGlobal:窗口管理操作,所有Activity都是通过这个进程内唯一的WindowManagerGlobal对象和WMS通信;
ViewRootImpl:
1.View树的树根并管理View树;
2.触发View的测量、布局以及绘制;
3.输入相应的中转站;
4.负责与WMS进行进程间通信;

TextView.setText刷新流程

setText刷新流程ViewRootImpl会调用scheduleTraversals准备重绘,但是,重绘一般不会立即执行,而是往Choreographer的Choreographer.CALLBACK_TRAVERSAL队列中添加了一个mTraversalRunnable,同时申请VSYNC,这个mTraversalRunnable要一直等到申请的VSYNC到来后才会被执行;

小结

android一般60fps,是VSYNC信号决定的,【每16ms刷新一帧(连续调用setText只会触发一次重绘)】,VSYNC信号要客户端主动申请,才会有VSYNC刷新,UI没更改,不会请求VSYNC信号进行刷新;下一篇将会介绍WMS关于输入事件的分发流程Android WMS工作原理浅析(二)

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值