一般情况下所说的Activity的启动有两种,
一种是复用,一种是新建。
也有说法分为laucher启动和Activity切换时的启动,本质是一样的:
在Activity未实例化之前,均需初始化,实例化后,就只需要改变栈中的状态即可。
这里的源码使用的是android-26
因为就Android本身的源码而言,太过冗杂,并且每个版本的源码都有一些差别,故而贴代码的作用不大,这里也就不贴出来了。
只把简单的图表给出来作为记载。
先上图,这是调用startActivity时所经的方法流程:
调用startActivity的大致流程分为两步,
- 将当前栈顶的Activity状态置为onPause
- 将启动的Activity状态置为onResume,若尚未新建,则新建Activity实例并Resume
至于是怎么通过zygote进程fork出一个新的Activity实例的过程,可以找zygote相关的资料查看,这里暂且不提。
图中一些类的简要概念如表所示:
类 | 作用 |
---|---|
Instrumentation | Activity实例的委托代理者,每个Activity均持有此类引用,应用单例 |
ActivityManagerService | Activity的管理服务端,Framework层的核心服务之一 |
ActivityStarter | Activity的启动控制器,可通过判定状态与FLAG使用不同模式启动Activity |
ActivityStackSupervisor | Activity栈的管理者,主要用于监管与调整栈的状态 |
ActivityStack | Activity栈 |
ActivityThread | Activity线程基类,应用的入口 |
ZygoteProcess | 应用孵化器,可与底层zygote进程进行通信实现应用层的孵化 |
抛开zygote不提,接着上面的新建Activity实例的流程,会再次由ActivityThread接手。无论是通过laucher点击应用,还是应用中切换Activity但目标Activity实例未初始化时,都需要ActivityThread接手新建并启动Activity实例。
新建Activity实例流程如下图:
Activity的启动都是从ActivityStackSupervisor的realStartActivityLocked方法中真正开始的,这也是这个方法名的用意。
其实整个流程充斥着大量细节,但如果不是从事系统开发,也不必太过追究,只要知道ActivityThread、AMS、Instrumentation几个类是怎么控制Activity的,也就够了。
以上。