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操作系统中,ActivityStackSupervisor、Stack、Task、TaskRecord以及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中的一个应用组件,代表了一个单一的屏幕,用户可以在其中进行交互。每个活动都是独立的,但通常与其他活动协同工作来形成用户在应用中的完整体验。在 Task 和 Stack 的上下文中,活动是这些结构的基本构建块。

一般一个包名对应一个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

相关推荐
三少爷的鞋9 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
Dovis(誓平步青云)12 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码14 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程17 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程19 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程19 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程19 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓19 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程19 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer