How to Inspect Recent Tasks, Task Stacks, and Activity Affinities on Android Using ADB dumpsys activity recents

In modern Android multitasking environments, managing task stacks and user navigation flow is critical for application usability and memory stability. When users switch between apps using gesture navigation or the Overview/Recents button, Android does not simply present a list of running processes. Instead, the ActivityTaskManagerService (ATMS) maintains an internal task hierarchy composed of persistent task IDs, activity stacks, launch flags, and activity affinities. Complex application architectures—such as deep linking, multiple concurrent document tasks, or embedded webviews—can cause unexpected task duplication, navigation loops, or leaked task snapshots if activity intent flags are misconfigured.

For Android developers, quality assurance engineers, and system security auditors, the Android Debug Bridge (ADB) provides comprehensive visibility into this multitasking hierarchy via dumpsys activity recents. This command reveals runtime task associations, persistent storage states, launch bounds, and recents card retention rules directly from the terminal.

Understanding Android Task Stacks, Affinities, and Launch Modes

Android manages application execution through structured task hierarchies:

  • Task: A collection of activities that users interact with when performing a certain job. Each task is assigned a unique, persistent numeric taskId (e.g. taskId=142).
  • Activity Affinity: Defined via android:taskAffinity in the AndroidManifest.xml. Affinity dictates which task an activity prefers to belong to. Activities sharing the same affinity are grouped into the same recents overview card by default.
  • Launch Modes: Attributes such as standard, singleTop, singleTask, and singleInstance dictate whether an incoming intent creates a new task or reuses an existing stack.
  • Recents Overview Cache: Android persists task metadata, launch intents, and graphical window snapshots to disk (/data/system_ce/0/recent_tasks/ and recent_images/), allowing apps to reappear in the recents carousel even after background process termination.

Connecting via ADB and Verifying Multi-Window Capabilities

Establish a debugging connection between your terminal workstation and the Android device via USB or Wireless debugging:

# Verify connected device status
adb devices -l

# Ensure device shell access is operational
adb get-state

Confirm the device’s display and multi-window support:

# Query Android OS release and multi-window configuration
adb shell getprop ro.build.version.release
adb shell dumpsys activity settings | grep -i "multi_window"

Executing dumpsys activity recents

To inspect the active recents task hierarchy, execute the command via the ADB shell:

# Query active recents task records and stacks
adb shell dumpsys activity recents

The diagnostic dump outputs the complete recents list maintained by the system server, including:

  • Recents Count: Total number of persistent tasks currently recorded in memory.
  • Ordered Task Records: A chronological list of tasks ordered by last user interaction (most recent at index 0).
  • Affinity Mappings: The declared root activity, affinity strings, and user profile ID (e.g. userId=0 for personal or userId=10 for work profile).
  • Intent Flags: Explicit bitmasks applied when the task was launched (such as FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_MULTIPLE_TASK).

Analysing Task Structure and Intent Flags

Examine a sample task block from the dumpsys activity recents output:

* Recent #0: Task{b4a8e12 #184 type=standard A=com.example.checkout U=0 visible=true mode=fullscreen}
    origActivity=com.example.shop/.MainActivity
    realActivity=com.example.shop/com.example.checkout.PaymentActivity
    intent={act=android.intent.action.VIEW dat=https://shop.example.com/checkout flg=0x10008000 cmp=com.example.shop/com.example.checkout.PaymentActivity}
    autoRemoveRecents=false isPersistable=true numActivities=2
    lastActiveTime=1731023450 (active 4s ago)

Key properties to evaluate during troubleshooting:

  • realActivity vs origActivity: Identifies whether an activity was launched via an alias or redirect. In the example above, the task originally opened via MainActivity but currently rests on PaymentActivity.
  • flg (Intent Flags): In this example, flg=0x10008000 corresponds to FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP. Verifying hex values confirms that intent triggers are behaving as intended.
  • autoRemoveRecents: If set to true (via android:autoRemoveFromRecents), the task card disappears from the overview screen immediately when all activities in the task are closed.
  • numActivities: Displays the depth of the back stack inside this specific task container.

Debugging Duplicate Recents Cards and Document Tasks

When implementing document-centric applications (such as web browsers with multiple tabs, document editors, or photo editors) using FLAG_ACTIVITY_NEW_DOCUMENT, inspect how tasks are segregated:

# Filter recents dump to observe tasks belonging to a specific package
adb shell dumpsys activity recents | grep -E "Task\{|realActivity|affinity" | grep -B 1 -A 2 "com.example.shop"

If multiple tasks share the same affinity without specifying FLAG_ACTIVITY_MULTIPLE_TASK, Android will replace the existing task rather than creating a new card. Conversely, accidental generation of multiple distinct tasks can clutter the user’s overview screen.

Inspecting and Simulating Recents Task Dismissal

To test how an application handles task termination when a user swipes away its card from the recents screen:

# Identify target taskId from recents dump
$TASK_ID = 184

# Remove the task programmatically via ADB
adb shell am task remove $TASK_ID

Monitor system logcat in another terminal window to confirm that onTaskRemoved() lifecycle callbacks execute properly in background services:

adb shell logcat -s ActivityTaskManager

Leveraging dumpsys activity recents empowers Android engineers to verify complex navigation stacks, eliminate duplicate task leaks, and build seamless multitasking experiences.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.