OnCreate階段
1捶码、AMS通過binder調(diào)起ActivityThread中的performLaunchActivity,performLaunchActivity會調(diào)用mInstrumentation.newActivity通過反射去創(chuàng)建了Activity
2塔嬉、performLaunchActivity方法中還會通過Application app = r.packageInfo.makeApplication(false, mInstrumentation)去調(diào)用LoadedApk中的makeApplication方法,最終也是調(diào)用到mInstrumentation中的newApplication方法,通過反射去創(chuàng)建了Application
3、performLaunchActivity方法中會調(diào)用activity.attach魁蒜,該方法中創(chuàng)建了一個PhoneWindow賦值給Activity,給PhoneWindow添加了一個事件監(jiān)聽的代理吩翻,讓Activity接管Window的事件監(jiān)聽兜看,給PhoneWindow設置了WIndowManager,方便后面使用狭瞎。
4细移、隨后在performLaunchActivity方法中執(zhí)行了mInstrumentation.callActivityOnCreate,執(zhí)行了Activity的生命周期熊锭,onCreate
OnResume
1弧轧、handleResumeActivity方法中執(zhí)行了performResumeActivity,performResumeActivity方法中執(zhí)行了r.activity.performResume(r.startsNotResumed, reason)球涛,Activity中的方法performResume又調(diào)用mInstrumentation.callActivityOnResume劣针,Instrumentation中的方法callActivityOnResume最終調(diào)用到Activity的onResume
2、performResumeActivity執(zhí)行后會返回ActivityClientRecord亿扁,里面記錄了OnCreate中創(chuàng)建的所有信息,后面會通過ActivityClientRecord拿到Activity再拿到PhoneWindow鸟廓,在調(diào)用WindowManager中的addView把PhoneWindow中的decorView添加到Window中(DecorView是在哪里創(chuàng)建的呢从祝,是在執(zhí)行這行代碼View decor = r.window.getDecorView()時PhoneWindow會去檢查是否已經(jīng)創(chuàng)建了DecorView,沒有就創(chuàng)建)調(diào)用WindowManager的addView時引谜,會調(diào)用到WindowManagerImpl牍陌,最終調(diào)用到WindowManagerGlobal,WindowManagerGlobal是一個單例员咽,整個應用共用一個毒涧,WindowManagerGlobal的addView方法,addView方法中會創(chuàng)建一個ViewRootImpl用來管理對應的View,值得注意的是ViewRootImpl創(chuàng)建的時候會記錄當下的線程贝室,以后后續(xù)更新View的時候檢測是不是在同一個線程中
public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow, int userId) {
//省略代碼...
root = new ViewRootImpl(view.getContext(), display);
view.setLayoutParams(wparams);
mViews.add(view);
mRoots.add(root);
mParams.add(wparams);
root.setView(view, wparams, panelParentView, userId);
}
}
ViewRootImpl中的setView會調(diào)用requestLayout契讲,一下是requsetLayout方法
public void requestLayout() {
if (!mHandlingLayoutInLayoutRequest) {
checkThread();
mLayoutRequested = true;
scheduleTraversals();
}
}
后面又調(diào)用了WindowSession的addToDisPlay添加Window
然后視圖回渲染到屏幕上仿吞。
視圖將會接受或處理任何用戶輸入。
系統(tǒng)和應用會將其視為一個活動的捡偏、可交互的窗口唤冈。