android进阶篇14、UI布局层次结构及布局加载流程源码解析

1、setContentView分析

当调用到我们的Activity的onCreate生命周期方法中后,接着会调用setContentView方法将我们传入的布局显示在界面上,那么这一过程如何实现呢?

相关方法调用如下所示。setContentView方法会调用父类Activity的setContentView方法,注释1处会调用getWindow的setContentView;注释2处是getWindow的实现,返回mWindow,mWindow是Window类型的变量;注释3处对Activity的成员变量mWindow进行赋值,PhoneWindow是window的唯一实现类,那么这个attach方法是在哪里调用的呢?就是在ActivityThread的performLaunchActivity方法中调用,其实就是AMS和activty的启动流程中调用的,我们在后边会单独进行分析。

public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID); //1
initWindowDecorActionBar();
}

public Window getWindow() {
return mWindow; //2
}

final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo info,
CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoiceInteractor voiceInteractor,
Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken) {
attachBaseContext(context);

mWindow = new PhoneWindow(this, window, activityConfigCallback); //3
、、、
}

2、mWindow.setContentView(layoutResID)

通过上面我们知道最终调用的是PhoneWindow的setContentView,方法如下所示,主要干了两件事情,注释1用于生成DecorView和mContentParent;注释2

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值