面试系列:说说 Activity、View、Window 之间的关系吧

1,180 阅读6分钟

写在前面

最近不少小伙伴在后台问我,说道:「南尘呀,你这个面试系列文章很久没更新啦,啥时候才更新呀,另外有没有收集面试题呀?」

面试系列 已经相隔很久没更新了,主要是因为南尘近期搞的  模拟面试 活动花费了太多时间,所以对我的广大读者朋友们深表歉意,不过现在开始依然是一有时间就会更新的。毕竟金三银四,想换东家的小伙伴也是比比皆是。

对于面试题收集这个问题,网上应该很多,但大多数只是一个题目。其实个人建议除了算法类问题,直接刷题只是有短期效果,长期可能还是得深入理解和积累,个人是不太推荐直接无脑刷题背答案这种应试准备的。

模拟面试 免费了 4 个月后更正为了收费活动,再次申明一下我收费的初衷:筛人。其实真的是筛人,不想再看到无脑发简历的人了,这是对信任我的读者的一种不公平。目前效果挺好的,在我们共同的努力下(我周末也开始做),往常排期都要排 1 个月的情况不再发生了。

放心,大家的简历我不会给任何人,之前就有一个学弟花钱想买你们的简历看,我也是直接拒绝了的。(注:学弟只是想参考大家的简历,绝无恶意,他是一个大二很牛逼的学生)

另外,对于收费的事情做个说明:之前我在推文中说收费 10.24,我想没有哪个人几个小时才值 10.24 元吧?其实那只是一个付费服务的态度,实际情况中,金额由大家决定,你给的多,那只能说明你觉得对你帮助很大,没有其他意思。你给的少,说明南尘做的活动对你价值不是很大,你甚至可以不给的,你依然是南尘的好读者。

另外一点是,不要直接加了好友就给我发红包了,大家真的挺积极的,各种刚加好友就给我发红包和转账,这样的情况我是一律不收的。因为这本来就没有一个固定的价格,等面试完毕后,大家直接到指定文章赞赏即可。

对于很多人要的 面试系列 文章链接,我现在放到了公众号主页菜单的「历史记录」子菜单下,需要的直接去看那篇纯链接文章,当然我只放了纯原创的。

下面就进入正题,给大家简单的带来我在 模拟面试 中的一个真实场景。

面试场景

什么是 Activity、View、Window?

Activity 是四大组件之一,也是我们的界面载体,可以展示页面;而 View 实际上就是一个一个的视图,这些视图可以搭载在一个 Layout 文件上,通过 Activity 的 setContentView()  方法传递给 Activity;Window 是一个窗体,每个 Activity 对应一个 Window,通常我们在代码中用 getWindow() 来获取它。

你是怎样理解它们三者之间的关系的?

Activity 像一个工匠 ( 控制单元 ),Window 像窗户 ( 承载模型 ),View 像窗花( 显示视图 ) LayoutInflater 像剪刀,Xml 配置像窗花图纸。

比喻挺生动,请问可以通俗一点么?

Activity 下装了一个 Window,Window 下装了 View,呃…

正文

这是我在「模拟面试」活动中一个真实的场景,应试者的答案并不能忽悠到我,因为这个答案网上早就传遍了,但一旦稍微变动一下,应试者的表现就差强人意,很明显,这位小伙伴没对源码进行更加深刻的理解,而只是简单地背下了答案。

我们来直接看看实战中的代码,相信大家都知道 Activity 通过 setContentView()  方法来加载布局,我们来看看 setContentView()  方法到底是怎样做的。

实际上是 getWindow().setContentView()  做的处理,那这个 getWindow()

你想的没错,这个 mWindow 实际上就是 PhoneWindow。Window 是一个抽象类,而 PhoneWindow 实际上就是 Window 的实现继承类。我们直接看看 PhoneWindow 的setContentView()  方法,看看会有什么新发现?

先判断了 mContentParent  是否为空,这个 mContentParent  是什么玩意儿?

这个 mContentParent  是一个 ViewGroup 对象,而从注释中可以明显地看到 Window 中的内容就放置在这里。如果为空,则直接执行 installDecor(),这里想都不用想都知道是在实例这个  mContentParent,我们可以直接进入源码来验证我们的猜想。

这里代码挺多,我就不截完了,但逻辑不难,我们先判断 mDecor  是否为 null,如果是,则直接初始化它。然后判断 mContentParent  是否为 null,如果是,则直接通过 mDecor  去初始化mContentParent

这块其实讲到这里大家就差不多了解了,这个问题也就不那么难答。

每个 Activity 包含了一个 Window 对象,这个对象是由 PhoneWindow 做的实现。而 PhoneWindow 将 DecorView 作为了一个应用窗口的根 View,这个 DecorView 又把屏幕划分为了两个区域:一个是 TitleView,一个是 ContentView,而我们平时在 Xml 文件中写的布局正好是展示在 ContentView 中的。

用个图展示一下。

受于时间和各种因素限制,可能南尘也没有讲解的很清楚,请大家见谅,持各种想法的朋友们请在下方留言,把你的想法让更多人看到。

我是南尘,只做比心的公众号,欢迎关注我。

推荐阅读:

给 Android 开发者的一点福利:免费模拟面试

「提离职」算正确的加薪姿势么?

我为什么想离职?

发年终奖的正确姿势

我为什么突然想转管理?


欢迎关注南尘的公众号:nanchen做不完的开源,写不完的矫情,只做比心的公众号,如果你喜欢,你可以选择分享给大家。如果你有好的文章,欢迎投稿,让我分享给大家。            长按上方二维码关注         做不完的开源,写不完的矫情        一起来看 nanchen 同学的成长笔记