Activity的启动知识整理

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线程)!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值