ActivityStack、ActivityTask、ActivityRecord关系

看图就明白了,三者之间的包含关系,然后再看下面的dumpsys,三者关系如此清晰。ActivityStack是统帅回退栈,里面是多个ActivityTask,Task里面又是record,record就是activity的记录,可能一个activity有多个record

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):
  Stack #1:
  mFullscreen=true
  mBounds=null
    Task id #110
    mFullscreen=true
    mBounds=null
    mMinWidth=-1
    mMinHeight=-1
    mLastNonFullscreenBounds=null
      TaskRecord{b9d8211 #110 A=com.hcc.app U=0 StackId=1 sz=1}
      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.hcc.app/com.adastragrp.hccn.capp.ui.activity.SplashActivity (has extras) }
        Hist #0: ActivityRecord{44a9238 u0 com.hcc.app/com.adastragrp.hccn.capp.ui.activity.SplashActivity t110}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.hcc.app/com.adastragrp.hccn.capp.ui.activity.SplashActivity (has extras) }
          ProcessRecord{5244e28 12413:com.hcc.app/u0a375}
    Task id #84
    mFullscreen=true
    mBounds=null
    mMinWidth=-1
    mMinHeight=-1
    mLastNonFullscreenBounds=null
      TaskRecord{4c72176 #84 A=com.UCMobile U=0 StackId=1 sz=1}
      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.UCMobile/.main.UCMobile (has extras) }
        Hist #0: ActivityRecord{b28a899 u0 com.UCMobile/com.uc.browser.InnerUCMobile t84}
          Intent { flg=0x10000000 cmp=com.UCMobile/com.uc.browser.InnerUCMobile }
          ProcessRecord{b6dad3a 2762:com.UCMobile/u0a249}
    Task id #88
    mFullscreen=true
    mBounds=null
    mMinWidth=-1
    mMinHeight=-1
    mLastNonFullscreenBounds=null
      TaskRecord{322c4a2 #88 A=com.android.settings U=0 StackId=1 sz=1}
      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.settings/.Settings (has extras) }
        Hist #0: ActivityRecord{8c1f06d u0 com.android.settings/.Settings t88}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.settings/.Settings (has extras) }
          ProcessRecord{bdd227c 4220:com.android.settings/1000}

    Running activities (most recent first):
      TaskRecord{b9d8211 #110 A=com.hcc.app U=0 StackId=1 sz=1}
        Run #2: ActivityRecord{44a9238 u0 com.hcc.app/com.adastragrp.hccn.capp.ui.activity.SplashActivity t110}
      TaskRecord{4c72176 #84 A=com.UCMobile U=0 StackId=1 sz=1}
        Run #1: ActivityRecord{b28a899 u0 com.UCMobile/com.uc.browser.InnerUCMobile t84}
      TaskRecord{322c4a2 #88 A=com.android.settings U=0 StackId=1 sz=1}
        Run #0: ActivityRecord{8c1f06d u0 com.android.settings/.Settings t88}

    mResumedActivity: ActivityRecord{44a9238 u0 com.hcc.app/com.adastragrp.hccn.capp.ui.activity.SplashActivity t110}

  Stack #0:
  mFullscreen=true
  mBounds=null
    Task id #82
    mFullscreen=true
    mBounds=null
    mMinWidth=-1
    mMinHeight=-1
    mLastNonFullscreenBounds=null
      TaskRecord{eb41df5 #82 A=smartisanos.task.launcher U=0 StackId=0 sz=1}
      Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10800100 cmp=com.smartisanos.launcher/.Launcher }
        Hist #0: ActivityRecord{d145f2c u0 com.smartisanos.launcher/.Launcher t82}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值