ActivityRecord、TaskRecord、ActivityStack以及Activity详解

adb shell dumpsys activity activities

输出涉及到了解 Android 活动管理器(Activity Manager)的当前状态,以及系统中运行的活动和任务的详细信息。这是系统中活动(Activities)、任务(Tasks)、堆栈(Stacks)等的管理和状态快照,对于调试和理解应用行为非常有用。下面是对提供的内容的详细解释:


ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):

  Stack #0: type=home mAboveHome=false mode=fullscreen
  isSleeping=false
  mBounds=Rect(0, 0 - 0, 0)
    Task id #1
    mBounds=Rect(0, 0 - 0, 0)
    mMinWidth=-1
    mMinHeight=-1
    mLastNonFullscreenBounds=null
    * TaskRecord{43459e7 #1 I=com.bbk.launcher2/.Launcher U=0 DislayId=0 StackId=0 sz=1}
      userId=0 effectiveUid=u0a133 mCallingUid=0 mUserSetupComplete=true mCallingPackage=null
      intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10a00100 cmp=com.bbk.launcher2/.Launcher}
      mActivityComponent=com.bbk.launcher2/.Launcher
      autoRemoveRecents=false isPersistable=false numFullscreen=1 activityType=2
      rootWasReset=true mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLE
      Activities=[ActivityRecord{9e9d3b4 u0 com.bbk.launcher2/.Launcher d0 s0 t1}]
      askedCompatMode=false inRecents=true isAvailable=true
      stackId=0
      hasBeenVisible=true mResizeMode=RESIZE_MODE_RESIZEABLE mTaskRecordSupportsPictureInPicture=false isResizeable=true lastActiveTime=392262515 (inactive for 3s)
      * Hist #0: ActivityRecord{9e9d3b4 u0 com.bbk.launcher2/.Launcher d0 s0 t1}
          packageName=com.bbk.launcher2 processName=com.bbk.launcher2
          launchedFromUid=0 launchedFromPackage=null userId=0
          app=ProcessRecord{d694814 2828:com.bbk.launcher2/u0a133}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10a00100 cmp=com.bbk.launcher2/.Launcher (has extras) }
          frontOfTask=true task=TaskRecord{43459e7 #1 I=com.bbk.launcher2/.Launcher U=0 DislayId=0 StackId=0 sz=1}
          taskAffinity=null
          mActivityComponent=com.bbk.launcher2/.Launcher
          baseDir=/data/app/com.bbk.launcher2-sBWtpnvqTArAKLOq4ZHohA==/base.apk
          dataDir=/data/user_de/0/com.bbk.launcher2
          stateNotNeeded=true componentSpecified=false mActivityType=home
          compat={480dpi} labelRes=0x7f110245 icon=0x7f0800e9 theme=0x7f12013f
          mLastReportedConfigurations:
           mGlobalConfig={1.25007 460mcc11mnc [zh_CN] ldltr sw360dp w360dp h730dp 480dpi nrml long hdr widecg port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 -
1080, 2400) mAppBounds=Rect(0, 76 - 1080, 2274) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATIO
N_0} s.111 themeId=34 nightModeLevel = -1}
           mOverrideConfig={1.25007 460mcc11mnc [zh_CN] ldltr sw360dp w360dp h730dp 480dpi nrml long hdr widecg port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0
- 1080, 2400) mAppBounds=Rect(0, 76 - 1080, 2274) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0
} s.10 themeId=34 nightModeLevel = -1}
          CurrentConfiguration={1.25007 460mcc11mnc [zh_CN] ldltr sw360dp w360dp h730dp 480dpi nrml long hdr widecg port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0
, 0 - 1080, 2400) mAppBounds=Rect(0, 76 - 1080, 2274) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATI
ON_0} s.62 themeId=34 nightModeLevel = -1}
          RequestedOverrideConfiguration={0.0 ?mcc?mnc ?localeList ?layoutDir ?swdp ?wdp ?hdp ?density ?lsize ?long ?ldr ?wideColorGamut ?orien ?uimode ?night ?touch ?keyb
/?/? ?nav/? winConfig={ mBounds=Rect(0, 0 - 0, 0) mAppBounds=null mWindowingMode=undefined mDisplayWindowingMode=undefined mActivityType=home mAlwaysOnTop=undefined mRotat
ion=undefined} themeId=0 nightModeLevel = -1}
          taskDescription: label="null" icon=null iconResource=0 iconFilename=null primaryColor=ff222222
           backgroundColor=ff000000
           statusBarColor=0
           navigationBarColor=0
          launchFailed=false launchCount=0 lastLaunchTime=-1d21h31m39s998ms
          haveState=false icicle=null
          state=RESUMED stopped=false delayedResume=false finishing=false
          keysPaused=false inHistory=true visible=true sleeping=false idle=true mStartingWindowState=STARTING_WINDOW_NOT_SHOWN
          fullscreen=true noDisplay=false immersive=false launchMode=2
          frozenBeforeDestroy=false forceNewConfig=false
          mActivityType=home
           nowVisible=true lastVisibleTime=-25s281ms
          connections=com.android.server.wm.ActivityServiceConnectionsHolder@d58d994
          resizeMode=RESIZE_MODE_RESIZEABLE
          mLastReportedMultiWindowMode=false mLastReportedPictureInPictureMode=false

    Running activities (most recent first):
      TaskRecord{43459e7 #1 I=com.bbk.launcher2/.Launcher U=0 DislayId=0 StackId=0 sz=1}
        Run #0: ActivityRecord{9e9d3b4 u0 com.bbk.launcher2/.Launcher d0 s0 t1}

    mResumedActivity: ActivityRecord{9e9d3b4 u0 com.bbk.launcher2/.Launcher d0 s0 t1}

  Stack #402: type=standard mAboveHome=false mode=fullscreen
  isSleeping=false
  mBounds=Rect(0, 0 - 0, 0)

    Task id #99900235
    mBounds=Rect(0, 0 - 0, 0)
    mMinWidth=-1
    mMinHeight=-1
    mLastNonFullscreenBounds=null
    * TaskRecord{e10ea43 #99900235 A=com.tencent.mm U=999 DislayId=0 StackId=402 sz=1}
      userId=999 effectiveUid=u999a210 mCallingUid=u0a133 mUserSetupComplete=true mCallingPackage=com.bbk.launcher2
      affinity=com.tencent.mm
      intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.tencent.mm/.ui.LauncherUI}
      mActivityComponent=com.tencent.mm/.ui.LauncherUI
      autoRemoveRecents=false isPersistable=true numFullscreen=1 activityType=1
      rootWasReset=true mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLE
      Activities=[ActivityRecord{45cffba u999 com.tencent.mm/.ui.LauncherUI d0 s402 t99900235}]
      askedCompatMode=false inRecents=true isAvailable=true
      mRootProcess=ProcessRecord{b5ecbf0 22860:com.tencent.mm/u999a210}
      stackId=402
      hasBeenVisible=true mResizeMode=RESIZE_MODE_RESIZEABLE mSupportsPictureInPicture=false isResizeable=true lastActiveTime=391606546 (inactive for 659s)
      * Hist #0: ActivityRecord{45cffba u999 com.tencent.mm/.ui.LauncherUI d0 s402 t99900235}
          packageName=com.tencent.mm processName=com.tencent.mm
          launchedFromUid=10133 launchedFromPackage=com.bbk.launcher2 userId=999
          app=ProcessRecord{b5ecbf0 22860:com.tencent.mm/u999a210}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.tencent.mm/.ui.LauncherUI bnds=[242,2086][434,2445] }
          frontOfTask=true task=TaskRecord{e10ea43 #99900235 A=com.tencent.mm U=999 DislayId=0 StackId=402 sz=1}
          taskAffinity=com.tencent.mm
          mActivityComponent=com.tencent.mm/.ui.LauncherUI
          baseDir=/data/app/com.tencent.mm-_nyo-EAY86WWW9ZjBRZPXQ==/base.apk
          dataDir=/data/user/999/com.tencent.mm
          stateNotNeeded=false componentSpecified=true mActivityType=standard
          compat={480dpi} labelRes=0x7f110e29 icon=0x7f0d0001 theme=0x7f12029d
          mLastReportedConfigurations:
           mGlobalConfig={1.25007 460mcc11mnc [zh_CN] ldltr sw360dp w360dp h730dp 480dpi nrml long hdr widecg port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 -
1080, 2400) mAppBounds=Rect(0, 76 - 1080, 2274) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATIO
N_0} s.2836 themeId=34 nightModeLevel = -1}
           mOverrideConfig={1.25007 460mcc11mnc [zh_CN] ldltr sw360dp w360dp h730dp 480dpi nrml long hdr widecg port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0
- 1080, 2400) mAppBounds=Rect(0, 76 - 1080, 2274) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATI
ON_0} s.1 themeId=34 nightModeLevel = -1}
          CurrentConfiguration={1.25007 460mcc11mnc [zh_CN] ldltr sw360dp w360dp h730dp 480dpi nrml long hdr widecg port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0
, 0 - 1080, 2400) mAppBounds=Rect(0, 76 - 1080, 2274) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=RO
TATION_0} s.1 themeId=34 nightModeLevel = -1}
          taskDescription: label="null" icon=null iconResource=0 iconFilename=null primaryColor=ff212121
           backgroundColor=fffafafa
           statusBarColor=ff000000
           navigationBarColor=ff000001
          launchFailed=false launchCount=0 lastLaunchTime=-9m10s39ms
          haveState=true icicle=Bundle[mParcelledData.dataSize=192]
          state=STOPPED stopped=true delayedResume=false finishing=false
          keysPaused=false inHistory=true visible=false sleeping=false idle=true mStartingWindowState=STARTING_WINDOW_NOT_SHOWN
          fullscreen=true noDisplay=false immersive=false launchMode=1
          frozenBeforeDestroy=false forceNewConfig=false
          mActivityType=standard
           nowVisible=false lastVisibleTime=-9m8s646ms
          resizeMode=RESIZE_MODE_RESIZEABLE
          mLastReportedMultiWindowMode=false mLastReportedPictureInPictureMode=false

    Running activities (most recent first):
      TaskRecord{e10ea43 #99900235 A=com.tencent.mm U=999 DislayId=0 StackId=402 sz=1}
        Run #0: ActivityRecord{45cffba u999 com.tencent.mm/.ui.LauncherUI d0 s402 t99900235}

    mLastPausedActivity: ActivityRecord{45cffba u999 com.tencent.mm/.ui.LauncherUI d0 s402 t99900235}

 ResumedActivity:ActivityRecord{9e9d3b4 u0 com.bbk.launcher2/.Launcher d0 s0 t1}

  ResumedActivity: ActivityRecord{9e9d3b4 u0 com.bbk.launcher2/.Launcher d0 s0 t1}

ActivityStackSupervisor state:
  topDisplayFocusedStack=ActivityStack{b8dd0c6 displayId=0 stackId=0 type=home mode=fullscreen visible=true translucent=false, 1 tasks}
  displayId=0 stacks=2
   mHomeStack=ActivityStack{b8dd0c6 displayId=0 stackId=0 type=home mode=fullscreen visible=true translucent=false, 1 tasks}
   mPreferredTopFocusableStack=ActivityStack{b8dd0c6 displayId=0 stackId=0 type=home mode=fullscreen visible=true translucent=false, 1 tasks}
   mLastFocusedStack=ActivityStack{b8dd0c6 displayId=0 stackId=0 type=home mode=fullscreen visible=true translucent=false, 1 tasks}
  mCurTaskIdForUser={0=2427, 999=99900235}
  mUserStackInFront={999=402}
  isHomeRecentsComponent=true  KeyguardController:
    mKeyguardShowing=false
    mAodShowing=false
    mKeyguardGoingAway=false
    Occluded=false DismissingKeyguardActivity=null at display=0
    mDismissalRequested=false
    mVisibilityTransactionDepth=0
  LockTaskController
    mLockTaskModeState=NONE
    mLockTaskModeTasks=
    mLockTaskPackages (userId:packages)=
      u0:[]
      u999:[]

1. Activity Manager Activities

这是活动管理器的一个快照,显示了系统中所有活动堆栈的当前状态。

2. Display #0

这代表设备的主显示屏。活动是从顶部到底部列出的。

3. Stack #0

这是一个类型为 home 的堆栈,意味着这个堆栈包含了主屏幕(Launcher)活动。

  • type=home: 表明这是一个包含家庭(主屏幕)活动的堆栈。
  • mode=fullscreen: 堆栈中的活动以全屏模式运行。
  • isSleeping=false: 堆栈不在睡眠状态。
  • mBounds: 表示活动的边界,在这个例子中为 0,说明堆栈充满整个显示屏。

4. Task Record

详细描述了一个任务的状态。

  • Task id #1: 这是任务的唯一标识符。
  • I=com.bbk.launcher2/.Launcher: 这是任务的主活动,即设备的启动器。
  • userId=0: 运行此任务的用户ID。
  • mCallingPackage=null: 启动这个任务的应用包名,在这个例子中没有指定。
  • intent: 指明了启动这个活动的意图。在这里是启动主屏幕。
  • mActivityComponent: 指定了活动组件的名称。
  • autoRemoveRecents=false: 如果此任务被移出最近任务列表时是否自动删除。
  • isPersistable=false: 是否可以将此任务保存到磁盘。
  • activityType=2: 活动类型为2,通常代表主屏幕。

5. Activity Record

描述了在任务中运行的具体活动。

  • packageName=com.bbk.launcher2, processName=com.bbk.launcher2: 活动的包名和进程名。
  • frontOfTask=true: 活动位于任务的前端。
  • visible=true: 活动当前可见。
  • state=RESUMED: 活动当前处于恢复状态。
  • nowVisible=true: 活动现在对用户可见。
  • fullscreen=true: 活动在全屏模式下运行。
    Hist #1和Hist #0表示Task内部栈存在的内容。当点击返回按钮时,Task中的当前Activity(Hist #1)会出栈(Task),得到新的栈顶(Hist #0)。

由于桌面应用没有在前台显示,因此其没有topResumeActivity. 而且其Task内部栈中只有一个元素Hist #0.

6. Running activities

列出了当前运行的活动,最近运行的活动排在最前面。

7. Resumed Activity

指出当前已恢复并处于活动状态的活动。在这里是主屏幕活动。

8. Stack #402 and Task #99900235

这部分描述了另一个堆栈和任务,相关于微信(com.tencent.mm),显示了微信主界面(LauncherUI)的状态。

9. ActivityStackSupervisor state

输出中的ActivityStackSupervisor state部分提供了有关活动堆栈监督器(ActivityStackSupervisor)的当前状态的详细信息。这个监督器是Android系统中负责管理所有活动堆栈的组件。以下是输出中各部分的详细解释:

ActivityStackSupervisor state:
topDisplayFocusedStack:

描述了当前具有焦点的顶部显示堆栈。在这个示例中,焦点堆栈是类型为home,模式为fullscreen的堆栈,可见且不透明。
displayId=0:表示这个堆栈在默认显示设备上。
stackId=0:堆栈的标识符。
visible=true:堆栈是可见的。
translucent=false:堆栈是不透明的。
displayId=0 stacks=2:

表示在显示ID为0的显示器上有2个活动堆栈。
mHomeStack, mPreferredTopFocusableStack, mLastFocusedStack:

这些都指向同一个堆栈,表明当前的主屏幕堆栈是焦点堆栈,也是最后一个有焦点的堆栈。
mHomeStack: 主屏幕堆栈。
mPreferredTopFocusableStack: 系统优先考虑的顶部可获得焦点的堆栈。
mLastFocusedStack: 最后一个获得焦点的堆栈。
mCurTaskIdForUser:

显示每个用户当前的任务ID。例如,用户0的当前任务ID是2427,用户999的当前任务ID是99900235。
mUserStackInFront:

显示每个用户前端显示的堆栈ID。对于用户999,前端堆栈是ID为402的堆栈。
isHomeRecentsComponent:

表明当前的home堆栈是否包含最近使用的应用组件,这里为true。

10. KeyguardController

关于设备锁屏控制器的状态信息,如是否正在显示锁屏等。

在Android操作系统中,ActivityStackSupervisorStackTaskTaskRecord以及Activity是关于如何管理和运行应用程序组件的核心概念。理解它们之间的关系对于深入了解Android的多任务处理和活动生命周期管理至关重要。

关系总结

  • ActivityStackSupervisor 管理多个 Stacks
  • 每个 Stack 包含一个或多个 Task
  • 每个 Task(通过 TaskRecord 实现)包含一个或多个 Activity

ActivityStackSupervisor

ActivityStackSupervisor 是一个高级管理组件,负责监督和协调设备上所有的 ActivityStacks。它确保根据用户的交互以及当前的系统状态来合理地管理和调度每个活动。ActivityStackSupervisor 处理如活动的启动、恢复、暂停、停止和销毁等任务,并管理这些活动在各个 ActivityStack 中的布局。

Stack

在Android中,Stack(通常被称为活动堆栈)是一组活动的集合,这些活动按照特定的顺序组织在一起,通常表示为一个堆栈数据结构,后进先出(LIFO)。每个堆栈都维护着自己的一组活动历史记录,这些活动按它们被打开的顺序来管理。用户在应用之间切换或在应用内部导航时,系统会通过 ActivityStack 来调整哪个活动应该显示在屏幕上。

Task

Task 是指一个逻辑任务,它包含一组彼此关联的活动,这些活动共同完成一个用户定义的任务。在Android多任务环境中,一个 Task 可以通过任务视图(如最近应用列表)中的一个条目来表示,用户可以切换到这个任务,或者移除这个任务。

每个 Task 通常开始于一个根活动,并可以包含多个活动,这些活动是用户在应用中进行交互时按顺序打开的。TaskRecord 是这个任务的具体实现,它记录了任务的状态,如活动的堆栈顺序、任务的配置(如全屏或多窗口模式)、以及任何与任务关联的其他元数据。

Activity

Activity 是Android中的一个应用组件,代表了一个单一的屏幕,用户可以在其中进行交互。每个活动都是独立的,但通常与其他活动协同工作来形成用户在应用中的完整体验。在 TaskStack 的上下文中,活动是这些结构的基本构建块。

一般一个包名对应一个Task,可是如果某Activity启动模式设置为SingleInstance,则会为其单独创建一个Task,其中的ActivityStack中只有单独的Activity;

ActivityStack用来记录Activity历史,以便Back回退时仿佛在同一个应用中(事实也如此),直到回退到HomeActivity;

如果多个Activity的TaskAffinity相同,则认为是同一个任务,共享一个Task;

ActivityStack继承自Task,所以实际Task就是ActivityStack;

如果Activity的TaskAffinity不同,系统会新创建一个Task,在PcMode下就表现为创建了两个窗口;

TaskAffinity意为任务相关性,一般默认包名;

如果是不同进程,那么就会有不同Task。注意同一进程可以有多个Task(比如singleInstance这一特殊启动模式或者FLAG_NEW_TASK flag);

另外一个重要概念是Display,可以理解为手机屏幕进行划分,每个Display就拥有独立的多个Task,彼此没有联系;

https://www.jianshu.com/p/94816e52cd77
https://www.jianshu.com/p/82f3af2135a8

### 回答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、付费专栏及课程。

余额充值