window常用flag
1.flag_not_focusable
表示window不需要焦点,也不需要接受各种输入事件,同时启用flag_not_touch_modal,事件最终传递给下层有焦点的window
2.flag_not_touch_modal
当前window焦点区域内的事件,当前window处理,焦点以为的事件给底层处理,重要的flag标记,一般都需要开启,不然底层window无法接收单击事件
3.flag_show_when_locaked
使用这个flag后window锁屏也可以展示
window的三种Type类型
- 应用window
一般对于一个activity - 子window
不能单独存在需要附属在特定的子window,例如dialog - 系统window
需要声明权限才能创建,toast、系统状态栏都是系统window
window的分层
每个window都有对应的z-ordered,和html的z-index概念一样
- 应用window的层级是1-99
- 子window是1000-1999
- 系统window是2000-2999
层级范围对于windowmanger.layoutparams的type参数,可以通过这个设置window的层级,层级高的在顶层。
速记
- window manger是访问window的入口有添加、删除、更新三个常用的方法
- window是一个抽象概念不是真实存在的window即view,view即window,view是window的实体
- 每个window分别对应一个view和view rootimpl,window和view通过viewrootimpl来建立联系
- window manger的实现类是window mangerimpl,但没有直接实现window的增删改操作,通过桥接模式交给了window mangerg globa类来实现
- window mangerg globa有几个重要的列表分别用来存储view、viewrootimpl、windowmanger.layoutparams和待删除的view
- addview的时候会创建viewrootimpl并保存传递过来的参数到上述列表中,然后通过setview方法view传递给viewrootimpl
setview主要做以下两件事情
- 通过window session发起IPC告知window manger service来实现window的添加
- 调用request Layout方法完成异步刷新,最重要是在这个方法调用了scheduleTraversals方法完成view的测量、布局、绘制。
- window的删除和更新和添加基本上异曲同工
Activity的window的创建
- 通过反射得到activity时调用attach方法,此时会创建window,实际创建的就是phone window,setContentVie时会根据条件创建decorview,然后加载具体的布局文件到decor view因为此时他是个空的framview加载的布局文件依据版本情况来定可能会不一样,然后将我们通过setContentVie设置的文件加载到布局文件的content容器中
- decor view和view建立关联是在activity Thread调用handler Resume Activity方法其中调用完activity的on resume方法后会调用makVisible方法在这里会建立decor view和window的关联并显示。