Activity、Window、View的关系

荒了两年多不写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.csdn.net/windskier/article/details/6957854

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值