作者:bobby_developer
1. WMS原理:WMS角色与实例化过程
-
window:它是一个抽象类,具体实现类为 PhoneWindow ,它对 View 进行管理。Window是View的容器,View是Window的具体表现内容;
-
windowManager:是一个接口类,继承自接口 ViewManager ,从它的名称就知道它是用来管理 Window 的,它的实现类为 WindowManagerImpl;
-
WMS:是窗口的管理者,它负责窗口的启动、添加和删除。另外窗口的大小和层级也是由它进行管理的;
SystemServer启动WMS流程表:
1.1 window
1.2 显示层级
1.3 窗口标志位
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 之上