在Activity启动流程中,执行生命周期中的Create流程,在onCreate()方法中通过调用setContentView()方法,完成view的创建。前面源码的分析得出这一步仅仅是将布局创建,并没有显示出来。这篇文章继续分析,创建后的布局是如何显示出来的。
我们知道在执行完Create流程后,接下来会执行Resume流程,这一步会调用ActivityThread中的handleResumeActivity()方法。
public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,
String reason) {
// If we are getting ready to gc after going to the background, well
// we are back active so skip it.
unscheduleGcIdler();
mSomeActivitiesChanged = true;
// TODO Push resumeArgs into the activity for consideration
final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
...
if (r.window == null && !a.mFinished && willBeVisible) {
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
...
if (a.mVisibleFromClient) {
if (!a.mWindowAdded) {
a.mWindowAdded = true;
wm.addView(decor, l);
} else {
...
}
}
...
} else if (!willBeVisible) {
...
}
...
if (!r.activity.mFinished && willBeVisible && r.activity.mDecor != null && !r.hideForNow) {
...
r.activity.mVisibleFromServer = true;
mNumVisibleActivities++;
if (r.activity.mVisibleFromClient) {
r.activity.makeVisible();
}
}
...
}
首先会调用performResumeActivity()方法,这个方法最终会调用Activity中的onResume方法。
接着调用wm.addView(decor, l)方法,第一个参数decor是上面通过r.window.getDecorView()获得的,是一个DecorView,就是我们视图的根布局。
这里调用的是vm的addView()方法,省略了一部分代码,最后得到这个vm其实是一个WindowManagerImpl类的实例。在WindowManagerImpl类中找到addView()方法。
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
applyDefaultToken(params);
mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
}
调用WindowManagerGlobal中的addView方法。
public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow) {
...
ViewRootImpl root;
View panelParentView = null;
synchronized (mLock) {
...
root = new ViewRootImpl(view.getContext(), display);
view.