Framework 窗口添加流程分析1之 ViewRootImpl 创建
ActivityThread.handleResumeActivity()
// 第一部分析: 执行resumed流程,回调 Activity.onResume()
-> ActivityThread.performResumeActivity()
-> Activity.performResume()
-> Activity.dispatchActivityPreResumed()
-> Instrumentation.callActivityOnResume()
-> Activity.onResume()
-> FragmentController.dispatchResume()
-> Activity.dispatchActivityPostResumed()
-> ActivityThread.reportTopResumedActivityChanged()
// 第二部分析: 添加窗口,绘制应用界面,使 activity 可见
-> Activity.makeVisible()
-> WindowManagerImpl.addView()
-> WindowManagerGlobal.addView()
-> new ViewRootImpl()
-> DecorView.setLayoutParams()
-> ViewRootImpl.setView()
// 第三部分析: View 的绘制
-> ViewRootImpl.requestLayout()
-> checkThread() // 检查线程是不是创建 ViewRootImpl 的原始线程(可以大概理解为主线程)
-> mLayoutRequested = true
-> scheduleTraversals()
-> mHandler.getLooper().getQueue().postSyncBarrier()
-> mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable)
-> mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
-> performTraversals()
-> performMeasure()
-> performLayout()
-> performDraw()
-> Session.addToDisplayAsUser() // Binder call
-> WMS.addWindow()
-> DecorView.setVisibility()
// frameworks/base/core/java/android/app/ActivityThread.java
@Override
public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,String reason) {
// 省略部分
// 这里会执行resumed相关流程,同时会回调 Activity.onResume()
final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
if (r == null) {
// We didn't actually resume the activity, so skipping any follow-up actions.
return;
}
final Activity a = r.activity;
if (!r.activity.mFinished && willBeVisible && r.activity.mDecor != null && !r.hideForNow) {
// 省略部分
r.activity.mVisibleFromServer = true;
mNumVisibleActivities++;
if (r.activity.mVisibleFromClient) {
// 添加窗口,绘制应用界面,使 activity 可见
r.activity