Activity的启动知识整理
在学习Activity的过程中,参考着大神们的博客自己过了一下源码整理了一下。方便自己以后查看。
Android 7.0 startActivity()源码解析以及对几个问题的思考--Xu朝旭
作者:Xu朝旭 链接:https://www.jianshu.com/p/86ad1026cef3 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1、是通过何种方式生成一个新的Activity类的,是通过java反射生成的吗?
新的Activity类是通过类加载器方式即通过反射的方式生成的
ActivityThread里面:
ContextImpl appContext = createBaseContextForActivity(r); Activity activity = null; try { java.lang.ClassLoader cl = appContext.getClassLoader(); activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); ........................Instrumentation里面:
public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException { return (Activity)cl.loadClass(className).newInstance(); }接着调用了Activity的onCreate方法
ActivityThread的performLaunchActivity里面:
activity.mCalled = false; if (r.isPersistable()) { mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); } else { mInstrumentation.callActivityOnCreate(activity, r.state); }Instrumentation的里面:
public void callActivityOnCreate(Activity activity, Bundle icicle) { prePerformCreate(activity); activity.performCreate(icicle); postPerformCreate(activity); } public void callActivityOnCreate(Activity activity, Bundle icicle, PersistableBundle persistentState) { prePerformCreate(activity); activity.performCreate(icicle, persistentState); postPerformCreate(activity); }Activity里面:
final void performCreate(Bundle icicle) { restoreHasCurrentPermissionRequest(icicle); onCreate(icicle); mActivityTransitionState.readState(icicle); performCreateCommon(); } final void performCreate(Bundle icicle, PersistableBundle persistentState) { restoreHasCurrentPermissionRequest(icicle); onCreate(icicle, persistentState); mActivityTransitionState.readState(icicle); performCreateCommon(); }
2、Activity的生命周期回调方法是通过哪个类调用的,在什么时候调用的?
Activity的生命周期方法是通过Instrumentation类调用callActivityOnXXX方法最终调用Activity的onCreate等方法,调用时机为ActivityThread#performLaunchActivitiy()方法中。
ActivityThread的performLaunchActivity里面:
if (!r.activity.mFinished) { activity.performStart(); r.stopped = false; }Activity里面:
final void performStart() { mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions()); mFragments.noteStateNotSaved(); mCalled = false; mFragments.execPendingActions(); mInstrumentation.callActivityOnStart(this); .....................................Instrumentation的里面:
public void callActivityOnStart(Activity activity) { activity.onStart(); }除了Destroy方法,其他的生命周期都有在ActivityThread 里面显示的调用activity.performXXX 然后Activity里面调用 Intrumentation的 mInstrumentation.callActivityOnXXX方法来执行Activity的生命周期
Activity的onDestroy方法
ActivityThread里面:
public final ActivityClientRecord performDestroyActivity(IBinder token, boolean finishing) { return performDestroyActivity(token, finishing, 0, false); }private ActivityClientRecord performDestroyActivity(IBinder token, boolean finishing, int configChanges, boolean getNonConfigInstance) { ................... mInstrumentation.callActivityOnDestroy(r.activity); ................... }Instrumentation的里面:
public void callActivityOnDestroy(Activity activity) { activity.performDestroy(); }Activity里面:
final void performDestroy() { mDestroyed = true; mWindow.destroy(); mFragments.dispatchDestroy(); onDestroy(); mFragments.doLoaderDestroy(); if (mVoiceInteractor != null) { mVoiceInteractor.detachActivity(); } }这里看到调用Activity的onDestroy方法之前销毁的Window对象。前后销毁和Fragment相关联的对象。
3、界面的绘制是在执行Activity#onResume()之后还是之前?
ActivityThread#performResumeActivity() --> Activity#performResume() --> Instrumentation#callActivityOnResume() --> Activity#onResume()final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) { .............................. // TODO Push resumeArgs into the activity for consideration r = performResumeActivity(token, clearHide, reason); .............................. if (r.window == null && !a.mFinished && willBeVisible) { r.window = r.activity.getWindow(); View decor = r.window.getDecorView(); .............................. wm.addView(decor, l); ..............................所以页面的渲染再Ressume后。
但是怎么优化Activity的加载速度呢?
来看看DK_BurNIng大神的 深入理解 Activty 加载速度优化 吧。
4、在之前的学习中,我了解到应用程序的真正入口是ActivityThread类,那么ActivityThread#main()方法是在哪里调用的?
ActivityThread的main方法是在生成一个新的app进程过程中调用的,具体是通过与Zygote 通信,之后通过RuntimeInit类采用反射的方式调用ActivityThread#main()方法, 即生成app中的主线程(UI线程)!