#从Activity开始(二)——加载布局
本文也发布于本人的知乎文章:https://zhuanlan.zhihu.com/p/393862142
(注:源代码为android-8.1)
0. 前言
本篇文章主要讲解了当Activity
创建后,如何加载布局。
如果想了解Activity
是如何被启动起来的,可以参考我之前的文章:Android源码阅读分析:从Activity开始(一)——启动流程。
1. 代码分析
通常情况下,我们在Android Studio里新建一个Activity
时,会自动生成如下代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
在Activity
创建后,通常情况会调用setContentView
方法。查看Activity
的源码时,我们发现,setContentView
有三个同名重载方法,分别是
- setContentView(@LayoutRes int layoutResID)
- setContentView(View view)
- setContentView(View view, ViewGroup.LayoutParams params)
通常情况下,我们会使用第一个方法。下面对该方法进行跟踪。
(frameworks/base/core/java/android/app/Activity.java)
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
getWindow
方法返回一个Window
类的对象。Window
类是一个抽象类。从上一篇文章中可知,Activity
创建时调用了attach
方法,在attach
方法中创建了一个PhoneWindow
对象。下面就查看PhoneWindow
类中的setContentView
方法。
(frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java)
@Override
public void setContentView(int layoutResID) {
// 创建或清空顶层容器
if (mContentParent == null) {
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS