初始Window和WindowManager

一、Window和WIndowManager


1、添加Window

1)先新建一个WindowManager.LayoutParams对象layoutParams
2)设置layoutParams的flags、type、gravity等参数
3)最后通过WindowManager.addView(view, layoutParams)完成添加

2、flags属性

  • FLAG_NOT_FOCUSABLE:表示Window不需要获取焦点,也不需要接受各种输入事件,而是直接把事件传递给下层具有焦点的Window。
  • FLAG_NOT_TOUCH_MODEL:系统会将当前Window区域以内的单击事件自己处理,以外的传递给底层Window。
  • FLAG_SHOW_WHEN_LOCKED:让Window显示在锁屏的界面上。

3、type属性

表示Window的类型,分别为:
1)应用Window:层级范围1-99
2)子Window:层级范围1000-1999
3)系统Window:层级范围2000-2999

要点:

1)层级大的会覆盖在层极小的Window上面
2)如果使系统Window,需要在Manifest.xml中声明权限。

4、WindowManager提供的三个功能

WindowManager继承了ViewManager接口,其中有三个方法:
  • 1)addView:在Window中添加View
  • 2)removeView:在Window中移除View
  • 3)updateViewLayout:在Window中更新View

二、Window的内部机制


1、Window的添加过程

由WindowManagerGlobal的addView方法来处理
1)检查参数是否合法,如果是子Window那么还需要调整一些布局参数。
2)创建ViewRootImpl并将View添加到列表中,重要的有四个列表:
 -ArrayList<View> mViews:所有Window对应的View
 -ArrayList<ViewRootImpl> mRoots:所有Window对应的ViewRootImpl
 -ArrayList<WindowManager.LayoutParams> mParams:所有Window对应的布局参数
 -ArrayList<View> mDyingViews:存储那些已经调用removeView方法执行删除操作,但是还未完成的Window对象
3)通过ViewRootImpl.setView()来更新界面并完成Window的添加过程
 

2、Window的移除过程

由WindowManagerGlobal的removeView方法来处理
1)通过findViewLocked方法获取要删除的View的下标
2)再调用removeViewLocked,这个方法内部由ViewRootImpl的die方法进行删除操作,返回一个布尔值,若为true,则把这个View加入ArrayList<View> mDyingViews列表中
3)die方法内部做了简单处理
 -异步操作:发送一个MSG_DIE的消息,ViewRootImpl中的Handler会处理此消息并调用doDie方法。
 -同步操作:直接调用doDie方法。

3、Window的更新过程

由WindowManagerGlobal的updateViewLayout方法来处理
1)更新View的LayoutParams并替换掉老的LayoutParams。
2)接着更新ViewRootImpl中的LayoutParams,通过ViewRootImpl的setLayoutParams方法来实现。

三、Window的创建过程


1、Activity的Window创建过程


  • 1)由ActivityThread中的performLaunchActivity()完成整个启动过程,在这个方法内部通过类加载器创建Activity的实例对象,并调用其attach方法为其关联运行过程中所依赖的上下文环境变量。
  • 2)在Activity的attach方法里,系统会创建Activity所属的Window对象并为其设置回调接口。
  • 3)然后通过这个Window对象的setContentView方法,把Activity的视图附属在Window上。

2、Dialog的Window创建过程

  • 1)创建Window,和Activity的Window创建过程一样
  • 2)初始化DecorView,并将Dialog的视图添加到DecorView中
  • 3)将DecorView添加到Window中并显示

注意:

普通的Dialog有一个特殊之处,那就是必须采用Activity的Context,如果采用Application的Context,就会报错。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值