顶层视图DecorView添加到窗口的过程
在ActivityThread中,当Activity被创建完毕后,会将DecorView添加到Window中。
ActivityThread#handleResumeActivity()
final void handleResumeActivity(IBinder token,
boolean clearHide, boolean isForward, boolean reallyResume) {
//...
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
//先将DecorView设为不可见
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) {
a.mWindowAdded = true;
//将DecorView添加到Window中
wm.addView(decor, l);
}
}
再来看windowManager的实现类WindowManagerImpl#addView()
@Override
public void addView(View view, ViewGroup.LayoutParams params) {
mGlobal.addView(view, params, mDisplay, mParentWindow);
}
可以看到,其调用了WindowManagerGlobal#addView()
public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow) {
//...
final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams)param;
//...
ViewRootImpl root;
View panelParentView = null;
synchronized (mLock) {
//...
root = new ViewRootImpl(view.getContext(), display);
view.setLayoutParams(wparams);
mViews.add(view);
mRoots.add(root);
mParams.add(wparams);
}
//view(DecorView)和root建立关联
root.setView(view, wparams, panelParentView);
}
在此处,DecorView和Root建立了关联 ViewRootImplw#setView()
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
//...
requestLayout();
//...
}
再来看ViewRootImplw#requestLayout()
@Override
public void requestLayout() {
if (!mHandlingLayoutInLayoutRequest) {
checkThread();
mLayoutRequested = true;
scheduleTraversals();
}
}
调用了scheduleTraversals()
void scheduleTraversals() {
if (!mTraversalScheduled) {
//...
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
//...
}
}
mTraversalRunnable是什么呢? 是一个Runnable对象,内部调用了doTraversal()
final class TraversalRunnable implements Runnable {
@Override
public void run() {
doTraversal();
}
}
再来看doTraversal()
void doTraversal() {
//...
performTraversals();
//...
}
从performTraversals()开始,进入View的绘制流程,完成VIew的measure、layout、draw三大过程。