在Android系统中,Activity的启动是一个非常频繁发生的过程,在Framework层中,这个过程牵涉到的模块也非常多。本文将基于Android 8.0源码,以ActivityManagerService模块(以下简称AMS)的视角来分析其过程中主要发生的行为。
一. AMS中层次结构
AMS模块中涉及Activity的数据结构主要有三个:ActivityRecord,TaskRecord,ActivityStack. 其中ActivityRecord抽象地表示了每一个Activity,这个数据结构记录、管理了Activity的各种信息、属性、状态等。TaskRecord抽象地表示了任务的概念,任务是由一系列Activity以栈的形式组成的,一般情况下启动Activity都会在同一个任务中启动,添加了特殊的flag(FLAG_ACTIVITY_NEW_TASK)或者特殊的启动模式则会在新任务中启动一个Activity. 任务和进程并无限制关系,同一任务中也可存在其它进程的Activity,同一进程的Activity也可以存在与不同任务中。具象来看的话,系统中的最近任务界面显示的任务就和AMS里的TaskRecord描述的是一样的概念。ActivityStack则是用来管理TaskRecord的结构,是由一系列TaskRecord以栈的形式组成的。它是一个抽象的概念,在系统中无法具象地看到它。从6.0开始只有两个ActivityStack(桌面所在的TaskRecord在单独的ActivityStack中,其他TaskRecord在另一个),到8.0中已经有八个(为分屏,最近任务,画中画,自由模式等创建的),ActivityStack随着Android大版本升级越来越多。
二. Activity启动的主要流程
Activity启动时,客户端通过Binder向system server端进行通讯,通知AMS进行相应地处理,其时序图为(红色代表app进程,蓝色代表system server进程):
上面的时序图其实仅仅描述了在Activity启动时,AMS端的一些通用逻辑,绝大多数的情况下,在Activity启动时首先都会经历上述的流程。在上面时序图最后,也就是第10步的调用,会根据不同的情况进入不同的分支,后面会具体分析。
客户端的Instrumentation类会通过Binder call调用到AMS端的startActivity(上图步骤4),其参数列表为:
参数 | 解释 |
IApplicationThread caller |
调用者的IApplicationThread对象 |
String callingPackage |
调用者的包名 |