浅析Activity,Window,View之间的关系

理解Activity,Window还有View之间的关系,可以从Activity的onCreate中setContentView方法着手。

Activity.setContentView中实际调用的是PhoneWindow的setContentView方法,而PhoneWindow对象在Activity的attach中初始化。

参考Activity的代码:



PhoneWindow的setContentView会去调用installDecor方法,PhoneWindow的源码可以参考(http://androidxref.com/7.1.2_r36/xref/frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java

调用完installDecor方法后会给mContentParent赋值,我们自定义的Layout文件会通过LayoutInflator的inflate方法加载到mContentParent上。


installDecor主要有两个方法generateDecor和generateLayout。


如果DecorView为null, 则创建DecorView对象,否则将Window对象作为成员变量赋值给DecorView对象,这时候Window对象和DecorView对象就建立了一对一的关系,其实DecorView是FrameLayout的子类。

generateLayout(mDecor)中根据setFlags和requestFeature等方法来设置窗口的属值性,最后会根据这些属性选择加载不同的系统layout,其地址在:/frameworks/base/core/res/res/layout/下面


默认加载的是screen_simple.xml文件,通过AndroidStuido的Layout Inspector工具可以看见其布局文件结构如下:


generateLayout选择默认布局文件的部分代码如下:


我们可以在Activity的onCreate的setContentView之前调用requestFeature方法来更改加载默认的布局文件,比如调用getWindow().requestFeature(Window.FEATURE_LEFT_ICON)后,调用默认布局文件screen_title_icons.xml,其布局文件变成如下所示:


这些系统布局文件通过DecorView的onResourceLoaded方法加载到DecorView中(mDecor.onResourcesLoaded(mLayoutInflater, layoutResource);)


DecorView有几个比较重要的属性:


mWindow用来加载mContentParent

mContentRoot:就是系统的默认布局文件

mDecorCaptionView:多窗口view,Android7.0以后加入的新功能

在onResourceLoaded中,根据是否有mDecorCaptionView,将默认布局直接加载到DecorView的根布局中或者将默认布局加载到mDecorCaptionView中,然后将mDecorCaptionView作为DecorView的根布局。

这几个默认的系统布局文件中都会有一个id= "@android:id/content"的FrameLayout,我们自定义的布局文件最终会加载到这个FrameLayout中。


总结:

1, Activity的中onCreate调用的setContentView,实际上会调用PhoneWindow的setContentView。

2, PhoneWindow是抽象类Window的唯一实现类

3, Window是一个管理窗口外观和属性策略的抽象类,它的实现类以顶层视图的形式添加到WindowManager中。它提供了UI 策略比如背景颜色,title设置,默认的按键处理等等

4, PhoneWindow的installDecor方法中会:a) 调用generateDecor生成DecorView对象;b) 调用generateLayout生成contentLayout,这个contentLayout会去addView我们自定义的Layout文件。

5, PhoneWindow中会根据requestFeature和setFlag等方法,设置窗口的背景,title,等窗口属性。

6, generateLayout方法会根据设置的feature和Flag等窗口属性,加载系统默认的布局文件

7, 每个系统默认的布局文件都有一个id="@android:id/content"的FrameLayout布局。

8, 我们自定义的layout文件最终会加载到这个content布局中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值