ActivityRecord、TaskRecord、ActivityStack以及Activity启动模式详解

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) {
   
        
        }
    }
  • 实际上,ActivityRecord中存在着大量的成员变量,包含了一个Activity的所有信息。
  • ActivityRecord中的成员变量task表示其所在的TaskRecord,由此可以看出:ActivityRecordTaskRecord建立了联系。

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.<
  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Android 系统中,ActivityRecordActivityStackTaskRecord 是三个重要的概念,它们分别表示活动记录、活动栈和任务记录。它们之间的关系如下: - ActivityRecord:表示一个活动(即一个界面),其中记录了该活动的状态、标志和其他信息。 - TaskRecord:表示一个任务,即一组相关的活动。一个任务可以包含多个活动,但是只有一个活动处于前台运行状态。 - ActivityStack:表示一个活动栈,即一组任务的集合。一个 ActivityStack 对象通常对应一个屏幕上的 Activity 栈。 接下来,我们来看一下它们之间是如何绑定的。 首先,ActivityRecord 对象是在 ActivityThread 的 handleLaunchActivity 方法中创建的,该方法会根据传入的参数创建一个新的 ActivityRecord 对象,并将其添加到 TaskRecord 中。在创建 ActivityRecord 对象时,会调用 TaskRecord 的 addActivityLocked 方法,将 ActivityRecord 对象添加到 TaskRecord 中。同时,ActivityRecord 对象中也会保存对 TaskRecord 对象的引用,以便后续使用。 接着,TaskRecord 对象是在 ActivityManagerService 的 startActivity 方法中创建的,该方法用于启动一个新的活动。当启动一个活动时,ActivityManagerService 会先查找是否存在该任务的 TaskRecord 对象,如果不存在则创建一个新的 TaskRecord 对象,并将其添加到 ActivityStack 中。此时,TaskRecord 对象中也会保存对 ActivityStack 对象的引用。 最后,ActivityStack 对象是在 ActivityStackSupervisor 的 createStack 方法中创建的,该方法用于创建一个新的 ActivityStack 对象。在创建 ActivityStack 对象时,会调用 ActivityStackSupervisor 的 addStackToWindowManager 方法,将 ActivityStack 对象添加到 WindowManagerService 中。同时,ActivityStack 对象中也会保存对 ActivityStackSupervisor 对象的引用。 综上所述,ActivityRecordActivityStackTaskRecord 之间的绑定关系是:ActivityRecord 对象保存对 TaskRecord 对象的引用,TaskRecord 对象保存对 ActivityStack 对象的引用,而 ActivityStack 对象保存对 ActivityStackSupervisor 对象的引用。 ### 回答2: ActivityRecordActivityStackTaskRecordAndroid框架中用于管理Activity生命周期和任务栈的重要类。它们之间的绑定关系如下所述。 ActivityRecordActivity的代表,在内存中记录了每个Activity的信息,如任务栈的ID、Activity的状态、Intent等。ActivityStack是任务栈的管理类,用于管理任务栈中的ActivityTaskRecord是任务的代表,在内存中保存了一组相关联的ActivityActivityRecordTaskRecord之间的绑定关系是通过ActivityStack来建立的。在ActivityStack中,通过一个数组来保存TaskRecord,在TaskRecord中,通过一个链表来保存ActivityRecordActivityRecord中包含了TaskRecord的引用,用于表明该ActivityRecord属于哪个TaskRecord。 具体来说,在ActivityStack中,通过一系列操作将ActivityRecord添加到TaskRecord中。在启动一个新的Activity时,首先会查找目标Activity所在的TaskRecord。如果该TaskRecord不存在,则创建一个新的TaskRecord,并将ActivityRecord添加到该TaskRecord中。如果该TaskRecord已经存在,则将ActivityRecord添加到该TaskRecord中。在ActivityRecord中的task属性记录了所属TaskRecord的引用。 由于Activity可以有不同的启动模式(如standard、singleTop、singleTask、singleInstance等),所以在ActivityStack在添加ActivityRecordTaskRecord时需要考虑启动模式的不同。 总结起来,ActivityRecordActivityStackTaskRecord之间的绑定关系是通过ActivityRecord中的task属性和ActivityStack中的TaskRecord来建立的。ActivityRecord通过task属性指向所属的TaskRecord,而TaskRecord通过链表形式保存所属的ActivityRecord。这样就实现了在任务栈中管理Activity的目的。 ### 回答3: 在Android系统中,ActivityRecordActivityStackTaskRecord是三个重要的类,用于管理和调度Activity的生命周期和任务栈。下面是它们之间的绑定关系的源码分析。 1. ActivityRecord ActivityRecord是用于表示一个Activity实例的类,它包含了Activity的各种属性和状态。每个Activity实例都对应着一个唯一的ActivityRecord对象。在ActivityRecord类中,有一个成员变量称为task,用于保存当前Activity所属的TaskRecord对象。 2. TaskRecord TaskRecord是用于表示一个任务栈的类,它包含了一组ActivityRecord对象,形成了一个任务栈。每个TaskRecord对象都对应着一个唯一的任务栈。在TaskRecord类中,有一个成员变量称为stack,用于保存当前任务栈所属的ActivityStack对象。 3. ActivityStack ActivityStack是用于管理和调度任务栈的类,它包含了一组TaskRecord对象,形成了一个任务栈堆栈。在ActivityStack类中,有一个成员变量称为mTaskHistory,用于保存当前ActivityStack所维护的任务栈列表。 绑定过程如下: 1. 首先,当一个Activity启动时,Android会创建一个新的ActivityRecord对象,并给它分配一个唯一的taskId。 2. 接下来,ActivityStack会创建一个新的TaskRecord对象,并将该ActivityRecord对象加入到TaskRecord中。 3. 然后,TaskRecord对象会将自身加入到ActivityStack的mTaskHistory列表中,完成了TaskRecordActivityStack的绑定。 4. 同时,ActivityRecord对象会将自身的task成员变量指向所属的TaskRecord对象,完成了ActivityRecordTaskRecord的绑定。 5. 当一个Activity需要显示在屏幕上时,ActivityStack会将该Activity所在的TaskRecord对象置于栈顶,并将所属的ActivityStack对象置于前台。 通过以上步骤,完成了ActivityRecordActivityStackTaskRecord之间的绑定。这样,Android系统就能够根据TaskRecordActivityStack的关系,对Activity启动、切换和销毁进行管理和调度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值