一,布局
在Android studio的Tools–>Layout Inspector–>选中连接的手机–>打开你要看的应用,然后在屏幕上就会显示当前页面的布局结构图View Tree
切换页面,会显示不同的页面的View Tree,然后会将View Tree保存在项目的captures目录下。
从上图我们可以看到,我的页面只有一个LinearLayout下的TextVeiw,但是显示的View Tree外面却有其他的View 层。这里就是我们要说的Android的窗口机制。
二,窗口机制
1)Window
每一个Activity都包含一个Window对象,Window对象通常由PhoneWindow实现,Window位于 /sdk/sources/android-27/android/view/Window.java。该类是一个抽象类,提供了绘制窗口的一组通用API。可以将之理解为一个载体,各种View在这个载体上显示。
2)PhoneWindow
位于//sdk/sources/android-27/com/android/internal/policy/impl/PhoneWindow.java。该类继承于Window类,是Window类的具体实现,即我们可以通过该类具体去绘制窗口。并且,该类内部包含了一个DecorView对象,该DectorView对象是所有应用窗口(Activity界面)的根View。 简而言之,PhoneWindow类是把一个FrameLayout类即DecorView对象进行一定的包装,将它作为应用窗口的根View,并提供一组通用的窗口操作接口。
它是Android中的最基本的窗口系统,每个Activity 均会创建一个PhoneWindow对象,是Activity和整个View系统交互的接口。
3)DecorView
是PhoneWindow类的内部类(后面版本将DecorView拿出来了)。该类是一个FrameLayout的子类,并且是PhoneWindow的子类,该类就是对普通的FrameLayout进行功能的扩展,更确切点可以说是修饰(Decor的英文全称是Decoration,即“修饰”的意思),比如说添加TitleBar(标题栏),以及TitleBar上的滚动条等 。最重要的一点是,它是所有应用窗口的根View 。它主要有以下功能:
- Dispatch ViewRoot分发来的key、touch、trackball等外部事件;
-
DecorView有一个直接的子View,我们称之为System
Layout,这个View是从系统的Layout.xml中解析出的,它包含当前UI的风格,如是否带title、是否带process
bar等。可以称这些属性为Window decorations。 -
作为PhoneWindow与ViewRoot之间的桥梁,ViewRoot通过DecorView设置窗口属性。//可以这样获取 View
view = getWindow().getDecorView(); -
DecorView只有一个子元素为LinearLayout。代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域。DecorView里面TitleView:标题,可以设置requestWindowFeature(Window.FEATURE_NO_TITLE)取消掉ContentView:是一个id为content的FrameLayout。我们平常在Activity使用的setContentView就是设置在这里,也就是在FrameLayout上
Window类相当于一幅画(抽象概念,什么画我们未知) ,PhoneWindow为一副齐白石先生的山水画(具体概念,我们知道了是谁的、什么性质的画),DecorView则为该山水画的具体内容(有山、有水、有树,各种界面)。DecorView呈现在PhoneWindow上。
当系统(一般是ActivityManagerService)配置好启动一个Activity的相关参数(包括Activity对象和Window对象信息)后,就会回调Activity的onCreate()方法,在其中我们通过设置setContentView()方法类设置该Activity的显示界面,整个调用链由此铺垫开来。setContentView()的三个构造方法调用流程本质上是一样的
以上就是根据View Tree大致描述了一下Android窗口机制。
具体的源码分析之类的,其他文章已经做了详细分析:
https://www.jianshu.com/p/33bfb9ac90dd?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation