Android任务栈ActivityStack、TaskRecord、ActivityRecord关系

本文介绍了Android任务栈中ActivityStack、TaskRecord和ActivityRecord之间的关系。ActivityRecord代表历史栈中的一个活动条目,一个TaskRecord可能包含多个ActivityRecord,形成后进先出的任务栈。文章基于Android 27进行代码分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简介

先来张简单的关系图:


ActivityStack、TaskRecord、ActivityRecord关系图.png
  • 一个ActivityRecord对应一个Activity,保存了一个Activity的所有信息;但是一个Activity可能会有多个ActivityRecord,因为Activity可以被多次启动,这个主要取决于其启动模式。
  • 一个TaskRecord由一个或者多个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) {
    
    }
}<span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></div>
  • 实际上,ActivityRecord中存在着大量的成员变量,包含了一个Activity的所有信息。
  • ActivityRecord中的成员变量task表示其所在的TaskRecord,由此可以看出:ActivityRecordTaskRecord建立了联系。

startActivity()时会创建一个ActivityRecord

    frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java
 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.androi
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值