本文的绘制流程也是基于之前的几篇文章的(同上基于API——15)
1. 安卓应用启动流程分析
2. ActivityThread启动页面分析
3. Activity创建流程分析
上片 Activity创建流程分析说到Activity已经创建了并通过Instrumentation调用了Activity的onCreate方法,那么接下来需要干的事情就很明显了吧,我们在onCreate 的时候一般就是通过setContentView()方法设置布局,设置之后呢,那不知道谁反正是绘制出来了,本文的目的就在于,紧接上文寻找Activity是通过哪些类渲染页面的
setContentView()
public void setContentView(int layoutResID) {
// 各位大爷 真是基于api 15 的,高版本的 不一样的
//getWindow 获取到当前绑定的Window window本身就是一套接口,我们看的是具体实现的地方,上文attach方法提到了
//创建的window是PhoneWindow 源码在Policy类里面,
getWindow().setContentView(layoutResID);
initActionBar();
}
进入PhoneWindow
@Override
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
//这个逻辑已经不能再清晰了,最终我们写的View要添加到mContentParent中,他是一个ViewGroup
mLayoutInflater.inflate(layoutResID, mContentParent);
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}
首先查看mContentParent 是如何创建的
private void installDecor() {
if (mDecor == null) {
// 这里就是直接new DecorView(getContext(), -1); new了一个DecorView
mDecor = generateDecor();
mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
mDecor.setIsRootNamespace(true);
}
if (mContentParent == null) {
//到这个方法才生成,下面进入查看
mContentParent = generateLayout(mDecor);
mTitleView = (TextView)findViewById(com.android.internal.R.id.title);
if (mTitleView != null) {
if ((getLocalFeatures() & (1 << FEATURE_NO_TITLE)) != 0) {
View titleContainer =