1)浅析Activity从启动到显示(部分源码分析)

背景:
我们都知道在Activity中的onCreate方法中,调用setContentView(R.layout.activity_main)
就能将View与xml文件建立联系,并能将相应的xml文件显示在界面上,但是setContentView的这一过程,系统的底层究竟做了什么,我们却不得而知,接下来,让我们开始探索。
1、查看setContentView的源码,
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}

可以看到,在该方法的内部,调用getWindow()方法:
public Window getWindow() {
return mWindow;
}
可以看到该方法,返回一个mWindow对象,继续追踪,发现Window类是一个抽象类,在View类的attach方法中看到mWindow被赋值:
mWindow = new PhoneWindow(this, window);
mWindow.setWindowControllerCallback(this);
mWindow.setCallback(this);
mWindow.setOnWindowDismissedCallback(this);
mWindow.getLayoutInflater().setPrivateFactory(this);

可以发现,mWindow是一个PhoneWindow对象实例。可以发现在其构造函数中,为其构建了一个DecorView对象mDecor。
下面是整个界面的组成图:界面组成图
查看一下PhoneWindow中的setContentView方法可以发现:
setContentView
(mContentParent要么是mDecor,要么是mDecor的子类,用于存放ContentView的父容器。只有外部有容器,layout_width与layout_hight才能起作用。)
该方法,判断mContentParent是否存在,没有的话,创建一个DecorView。另外判断是否有内容过度动画,执行相应的处理,添加布局,形成上述的界面组成。
(到这一步时,并未完成显示,只是完成了相应的View树的构建)
最后获取回调方法,然后执行相应的回调方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值