一、Window和WIndowManager
1、添加Window
1)先新建一个WindowManager.LayoutParams对象layoutParams2)设置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中并显示