荒了两年多不写blog,开篇就来点基础的吧。
这个问题很早之前看别人的文章提到过一次,但是也记不清了,下面是我自己整理的:
其实如果从图上看,关系其实已经很明朗了
分析方法说明:
在写App的时候,这两者直接的关系似乎是最明了的。在Activity的onCreate()里面调用setContentView()几乎是必须的,因此分析时候就从这里为入口
在发现Activity的setContentView()其实是mWindow的setContentView(),而且Window的这个方法是abstract的,于是就需要找到其具体实现。这个时候,我们会考虑去看Activity是在哪里初始化以及是如何初始化mWindow的
最后发现setContentView()其实是PhoneWindow里面实现的,而PhoneWindow是继承Window的。于是Window和View的关系就可以在PhoneWindow的setContentView()里面来探究
于是按照正常流程走,当mContentParent为null的时候,我们需要去给Window做一些显示视图的初始化:installDecor()。可以想到这个方法一定会帮我们初始化mContentParent
最后结论
Window是持有一个DecorView,这个DecorView是一个FrameLayout
还持有两个ViewGroup,一个是mContentRoot,还有一个是mContentParent
mContentRoot是根据系统的主题属性使用LayoutInflater加载的不同的布局结构
mContentParent是mContentParent这个布局结构里面一个id为 android.internal.R.id.content 的ViewGroup
mContentRoot作为唯一子视图add到了DecorView里面,而mContentParent本身就在mContentRoot里面
setContentView()的View最后就是add到mContentParent里面的
最后总结:Activity 只是控制器只加载一个且只有一个Window,Window(确切是说是PhoneWindow)作为控制器和实际视图之间的载体,持有着最上层View–DecorView,而负责视图显示的就是DecorView以及它的子View
DecorView与其子View的关系图
另外这篇文章也是说这个的,写得挺不错的:
http://blog.youkuaiyun.com/windskier/article/details/6957854