Window和WindowManger小记

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的关联并显示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值