前言

作为Android开发,我们经常会写startActivity方法,这样我们就可以启动Activity了,在这个过程中到底发生了什么呢?换句话说Activity是怎么启动的呢?如果和我有一样的好奇,我们来一起走进代码的细节中了解一下。

启动Activity

查看源码可以知道,startActivity()方法最终是调用了startActivityForResult()方法来执行的。

startActivityForResult

Instrumentation.ActivityResult ar =
    mInstrumentation.execStartActivity(
        this, mMainThread.getApplicationThread(), mToken, this,
        intent, requestCode, options);
if (ar != null) {
    mMainThread.sendActivityResult(
        mToken, mEmbeddedID, requestCode, ar.getResultCode(),
        ar.getResultData());
}

这里的主要就是这个方法:mInstrumentation.execStartActivity()

这里的流程很复杂,我们来看流程图。

generate_activity.png

在最后的handleLaunchActivity方法中,调用了performLaunchActivity生成Activity, 调用handleResumeActivityActivity进入Resume生命周期。

这里也留下一个伏笔,后面写Android App的启动流程的时候还是在这个流程中,尤其是startSpecificActivityLocked方法。

performLaunchActivity

java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent)

生成Activity的核心就这两句代码,通过InstrumentationnewActivity方法生成。

这里要记住Instrumentation,它很重要,但是先放着,我们继续来看Activity的启动流程。

callActivityOnResume

handleResumeActivity经过多层调用,最终调用了InstrumentationcallActivityOnResume方法

 public void callActivityOnResume(Activity activity) {
    activity.mResumed = true;
    activity.onResume();
}

这样ActivityonResume方法就会被调用。也就意味着Activity生命周期走到Resume的状态,这样的Activity算是启动完成了。

总结

我们可以看到,从startActivityActivity进入Resume的生命周期,有一个类的身影若隐若现,那就是Instrumentation, 这个类负责管理Application的创建和启动,负责Activity的创建和生命周期的管理。所以,一旦你操纵这个类,你能做的事情就有很多。比如,在Activity生命周期的过程中添加一些消息。

经过我的总结,Activity的生命周期是有一个套路在的,这个套路就是:

scheduleXXXActivity->handleXXXActivity->performXXActivity->CallActivitiyXXX—>Activity.XXX

scheduleXXXActivity负责发消息给Handler(H)发对应的消息。 接着就和之前文章中提到的内容类似,每个生命周期都要经过这样一个过程来调度。

到这里,我们就大概浏览了一下Activity的启动流程,希望你在遇到这方面的问题的时候,能把这个博客当作一个目录,知道去哪里找对应的源码,思考对应的解决方案。