OnCreate阶段
1、AMS通过binder调起ActivityThread中的performLaunchActivity,performLaunchActivity会调用mInstrumentation.newActivity通过反射去创建了Activity
2、performLaunchActivity方法中还会通过Application app = r.packageInfo.makeApplication(false, mInstrumentation)去调用LoadedApk中的makeApplication方法,最终也是调用到mInstrumentation中的newApplication方法,通过反射去创建了Application
3、performLaunchActivity方法中会调用activity.attach,该方法中创建了一个PhoneWindow赋值给Activity,给PhoneWindow添加了一个事件监听的代理,让Activity接管Window的事件监听,给PhoneWindow设置了WIndowManager,方便后面使用。
4、随后在performLaunchActivity方法中执行了mInstrumentation.callActivityOnCreate,执行了Activity的生命周期,onCreate
OnResume
1、handleResumeActivity方法中执行了performResumeActivity,performResumeActivity方法中执行了r.activity.performResume(r.startsNotResumed, reason),Activity中的方法performResume又调用mInstrumentation.callActivityOnResume,Instrumentation中的方法callActivityOnResume最终调用到Activity的onResume
2、performResumeActivity执行后会返回ActivityClientRecord,里面记录了OnCreate中创建的所有信息,后面会通过ActivityClientRecord拿到Activity再拿到PhoneWindow,在调用WindowManager中的addView把PhoneWindow中的decorView添加到Window中(DecorView是在哪里创建的呢,是在执行这行代码View decor = r.window.getDecorView()时PhoneWindow会去检查是否已经创建了DecorView,没有就创建)调用WindowManager的addView时,会调用到WindowManagerImpl,最终调用到WindowManagerGlobal,WindowManagerGlobal是一个单例,整个应用共用一个,WindowManagerGlobal的addView方法,addView方法中会创建一个ViewRootImpl用来管理对应的View,值得注意的是ViewRootImpl创建的时候会记录当下的线程,以后后续更新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会调用requestLayout,一下是requsetLayout方法
public void requestLayout() {
if (!mHandlingLayoutInLayoutRequest) {
checkThread();
mLayoutRequested = true;
scheduleTraversals();
}
}
后面又调用了WindowSession的addToDisPlay添加Window
然后视图回渲染到屏幕上。
视图将会接受或处理任何用户输入。
系统和应用会将其视为一个活动的、可交互的窗口。