1.简介
先来张简单的关系图:
- 一个
ActivityRecord
对应一个Activity
,保存了一个Activity
的所有信息;但是一个Activity
可能会有多个ActivityRecord
,因为Activity
可以被多次启动,这个主要取决于其启动模式。 - 一个
TaskRecor
d由一个或者多个ActivityRecord
组成,这就是我们常说的任务栈,具有后进先出的特点。 ActivityStack
则是用来管理TaskRecord
的,包含了多个TaskRecord
。
下面进入详细的代码分析,本文源码基于android 27。
2.代码分析
2.1 ActivityRecord
ActivityRecord,源码中的注释介绍:An entry in the history stack, representing an activity.
翻译:历史栈中的一个条目,代表一个activity。
frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java
final class ActivityRecord extends ConfigurationContainer implements AppWindowContainerListener {
final ActivityManagerService service; // owner
final IApplicationToken.Stub appToken; // window manager token
AppWindowContainerController mWindowContainerController;
final ActivityInfo info; // all about me
final ApplicationInfo appInfo; // information about activity's app
//省略其他成员变量
//ActivityRecord所在的TaskRecord
private TaskRecord task; // the task this is in.
//构造方法,需要传递大量信息
ActivityRecord(ActivityManagerService _service, ProcessRecord _caller, int _launchedFromPid,
int _launchedFromUid, String _launchedFromPackage, Intent _intent, String _resolvedType,
ActivityInfo aInfo, Configuration _configuration,
com.android.server.am.ActivityRecord _resultTo, String _resultWho, int _reqCode,
boolean _componentSpecified, boolean _rootVoiceInteraction,
ActivityStackSupervisor supervisor, ActivityOptions options,
com.android.server.am.ActivityRecord sourceRecord) {
}
}
- 实际上,
ActivityRecord
中存在着大量的成员变量,包含了一个Activity
的所有信息。 ActivityRecord
中的成员变量task
表示其所在的TaskRecord
,由此可以看出:ActivityRecord
与TaskRecord
建立了联系。
startActivity()
时会创建一个ActivityRecord
:
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java
class ActivityStarter {
private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
com.android.server.am.ActivityRecord[] outActivity, TaskRecord inTask) {
//其他代码略
ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
callingPackage, intent, resolvedType, aInfo, mService.<