Activity启动流程
文章目录
前言
作为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()。
这里的流程很复杂,我们来看流程图。

在最后的handleLaunchActivity方法中,调用了performLaunchActivity生成Activity,
调用handleResumeActivity让Activity进入Resume生命周期。
这里也留下一个伏笔,后面写Android App的启动流程的时候还是在这个流程中,尤其是startSpecificActivityLocked方法。
performLaunchActivity
java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent)
生成Activity的核心就这两句代码,通过Instrumentation的newActivity方法生成。
这里要记住Instrumentation,它很重要,但是先放着,我们继续来看Activity的启动流程。
callActivityOnResume
handleResumeActivity经过多层调用,最终调用了Instrumentation的callActivityOnResume方法
public void callActivityOnResume(Activity activity) {
activity.mResumed = true;
activity.onResume();
}
这样Activity的onResume方法就会被调用。也就意味着Activity生命周期走到Resume的状态,这样的Activity算是启动完成了。
总结
我们可以看到,从startActivity到Activity进入Resume的生命周期,有一个类的身影若隐若现,那就是Instrumentation, 这个类负责管理Application的创建和启动,负责Activity的创建和生命周期的管理。所以,一旦你操纵这个类,你能做的事情就有很多。比如,在Activity生命周期的过程中添加一些消息。
经过我的总结,Activity的生命周期是有一个套路在的,这个套路就是:
scheduleXXXActivity->handleXXXActivity->performXXActivity->CallActivitiyXXX—>Activity.XXX
scheduleXXXActivity负责发消息给Handler(H)发对应的消息。
接着就和之前文章中提到的内容类似,每个生命周期都要经过这样一个过程来调度。
到这里,我们就大概浏览了一下Activity的启动流程,希望你在遇到这方面的问题的时候,能把这个博客当作一个目录,知道去哪里找对应的源码,思考对应的解决方案。