查看任务的活动堆栈


138

在我仍在学习该平台的同时,我刚刚开始开发一个简单的Android应用程序。

我正在使用带有ADT插件0.9.6的Eclipse IDE。

我需要知道是否可以查看Activity与任务关联的堆栈吗?

是否可以通过DDMS工具或其他任何方法来使用?

本质上,我需要的是能够查看任务的堆栈活动,以确保应用程序的行为符合预期。

我知道可以通过在Intent对象中使用标志和<activity>元素的某些属性来在某种程度上控制任务的行为。

但是,最好有一种工具-尤其是在调试模式下-允许开发人员直接看到Activity堆栈。


如果您使用的是Android Studio,请在[此处] [1]发布解决方案。[1]:stackoverflow.com/a/22392616/1798991
Nebu 2014年

Answers:


164

在命令行中,您可以使用: adb shell dumpsys activity

这要求活动管理器打印其当前状态的转储。第一部分是按任务组织的完整活动历史记录。之后还打印了很多东西,因此您可能需要向上滚动一点以找到所需的内容。

这是其输出的示例(具体内容随平台版本的不同而不同),显示了最主要的任务是与两个活动的联系,在其后是具有一个活动的启动器:

当前活动管理者状态中的活动:
  * TaskRecord {44d07218#4 android.task.contacts}
    clearOnBackground = true numActivities = 2 rootWasReset = true
    finity = android.task.contacts
    intent = {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10600000 cmp = com.android.contacts / .DialtactsActivity bnds = [125,640] [235,758]}
    origActivity = com.android.contacts / .DialtactsContactsEntryActivity
    realActivity = com.android.contacts / .DialtactsActivity
    lastActiveTime = 288203177(14秒钟无效)
    *历史记录8:HistoryRecord {44b87a30 com.android.contacts / .ViewContactActivity}
        packageName = com.android.contacts processName = android.process.acore
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168:android.process.acore / 10004}
        意图{act = android.intent.action.VIEW dat = content://com.android.contacts/contacts/lookup/144i148.144i461a29500afc8eeb/1927 cmp = com.android.contacts / .ViewContactActivity}
        frontOfTask = false task = TaskRecord {44d07218#4 android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .ViewContactActivity
        base = / system / app / Contacts.apk / system / app / Contacts.apk data = / data / data / com.android.contacts
        labelRes = 0x7f090012图标= 0x7f02006b主题= 0x7f0e0004
        stateNotNeeded = false componentSpecified = false isHomeActivity = false
        配置= {标尺= 1.0 imsi = 310/4 loc = zh_CN touch = 3键= 2/1/2导航= 2/2 orien = 1布局= 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho =最喜欢的resultCode = 2
        launchFailed = false haveState = false icicle = null
        状态=停止已恢复=否已延迟=恢复=否已完成=否
        keysPaused = false inHistory = true持久= false launchMode = 0
        fullscreen = true可见= true FrozenBeforeDestroy = false thumbnailNeeded = false idle = true
        等待Visible = false现在Visible = true
    *历史记录7:HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity}
        packageName = com.android.contacts processName = android.process.acore
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168:android.process.acore / 10004}
        意图{act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10200000 cmp = com.android.contacts / .DialtactsContactsEntryActivity bnds = [125,640] [235,758]}
        frontOfTask = true task = TaskRecord {44d07218#4一个android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .DialtactsActivity
        base = / system / app / Contacts.apk / system / app / Contacts.apk data = / data / data / com.android.contacts
        labelRes = 0x7f090007图标= 0x7f02006b主题= 0x7f0e0000
        stateNotNeeded = false componentSpecified = true isHomeActivity = false
        配置= {标尺= 1.0 imsi = 310/4 loc = zh_CN touch = 3键= 2/1/2导航= 2/2 orien = 1布局= 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        状态=已停止已停止=真已延迟简历=否整理=否
        keysPaused = false inHistory = true持久= false launchMode = 2
        fullscreen = true可见= false FrozenBeforeDestroy = false thumbnailNeeded = false idle = true
  * TaskRecord {44c4ee90#2 com.android.launcher}
    clearOnBackground = true numActivities = 1 rootWasReset = true
    finity = com.android.launcher
    intent = {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10600000 cmp = com.android.launcher / .Launcher}
    realActivity = com.android.launcher / .Launcher
    lastActiveTime = 214734838(在73483秒内未激活)
    *历史记录6:HistoryRecord {44c4d988 com.android.launcher / .Launcher}
        packageName = com.android.launcher processName = android.process.acore
        launchdFromUid = 0 app = ProcessRecord {44c4f348 1168:android.process.acore / 10004}
        意图{act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10000000 cmp = com.android.launcher / .Launcher}
        frontOfTask = true task = TaskRecord {44c4ee90#2 com.android.launcher}
        taskAffinity = com.android.launcher
        realActivity = com.android.launcher / .Launcher
        base = / system / app / Launcher.apk / system / app / Launcher.apk data = / data / data / com.android.launcher
        labelRes = 0x7f0a0000图标= 0x7f020015主题= 0x103005f
        stateNotNeeded = true componentSpecified = false isHomeActivity = true
        配置= {标尺= 1.0 imsi = 310/4 loc = zh_CN touch = 3键= 2/1/2导航= 2/2 orien = 1布局= 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        状态=已停止已停止=真已延迟简历=否整理=否
        keysPaused = false inHistory = true持久= false launchMode = 2
        fullscreen = true可见= false FrozenBeforeDestroy = false thumbnailNeeded = false idle = true

有没有一种好的方法可以通过logcat显示当前应用程序的所有任务和活动堆栈?我们真的需要解析adb命令吗?
android开发人员

85
另外,如果只想在堆栈中查看活动的名称,则可以执行以下操作:adb shell <enter> dumpsys activity | grep -i run
Surya Wijaya Madjid'2

6
好答案!我编写了一个便捷脚本,该脚本过滤输出以获取给定包的任务/活动。
sschuberth

5
此外,adb shell dmpsys activity您还可以获取每个列表,例如adb shell dmpsys activity activitiesACTIVITY MANAGER ACTIVITIES,其中包含主堆栈,正在运行的活动和最近的任务。dumpsys activity intents待定的意图;dumpsys activity broadcasts广播状态;dumpsys activity providers对于内容提供者;dumpsys activity services服务;dumpsys activity processes用于运行进程。
Fredrick Gauss 2013年

1
@SuryaWijayaMadjid的命令可以在一行中完成:adb shell dumpsys activity | grep -i run,或adb shell dumpsys activity activities | grep -i run用于稍微清晰的输出。
vaughandroid18年

58

您可以在命令行中使用以下命令来查看系统中的任务和后退堆栈:

adb shell dumpsys activity activities | sed -En -e '/Stack #/p' -e '/Running activities/,/Run #0/p'

或者,您可以尝试TaskLogger(我创建的一个简单工具),该工具可以监视App中的所有活动和任务,并在Logcat中实时输出它们。


+1 ....我已经尝试过使用TaskLogger,它是一个很好的工具,对我有很大帮助,但是会打印大量不需要的日志。
ThinkDeep

34

我知道这是一个古老的问题,但是,此功能现已包含在Android Studio中:

android studio屏幕截图

然后在结果文本文件中搜索ACTIVITY(全部大写):

android studio文本文件截图


20
我认为该选项已不存在,因为Android Studio 3.0中新的Android Profiler窗口取代了Android Monitor工具。
水果

5
我为此缺少的功能创建了一个问题:issuetracker.google.com/issues/77944626,所以请投票。谢谢
mtrakal 18'Apr

27

如果要检查特定程序包的任务堆栈,请执行以下命令:

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist

12

我总是检查长转储消息的这一部分。

  Running activities (most recent first):
TaskRecord{4307f828 #56 A com.demo.proj U 0}
  Run #4: ActivityRecord{425a6838 com.demo.proj/com.demo.proj.Activity2}
  Run #3: ActivityRecord{427dc860 com.demo.proj/com.demo.proj.Activity1}
  Run #2: ActivityRecord{420cba18 com.demo.proj/com.demo.proj.MainActivity}
TaskRecord{430341d0 #2 A com.lge.launcher2 U 0}
  Run #1: ActivityRecord{41e0af68 com.lge.launcher2/.Launcher}
TaskRecord{44e26ce0 #18 A com.lge.appbox.client U 0}
  Run #0: ActivityRecord{41e9dbe8 com.lge.appbox.client/.AppBoxClient}

注意:“运行#4”是您现在在屏幕上看到的活动。:)


2
什么是“长时间转储邮件”?
玛丽安(MarianPaździoch)2014年

2
@MarianPaździoch“ adb shell dumpsys活动”向我们显示了太多消息。上面的此消息只是其中的一部分。顺便说一句,我得到的小费可以避免这种情况。运行此“ adb shell dumpsys活动活动”,您可以看到较短的消息,并且可以更轻松地阅读有关活动堆栈的信息。:)
cmcromance 2014年

1
...如果该列表仍然太长,请打开“最近使用的应用程序”列表,然后轻扫一些任务。
巴里·弗鲁特曼

10

您可以使用工具hierarchyviewer.bat。它是android SDK的一部分。但是,它仅适用于模拟器。但这更加舒适和清晰。

编辑:我刚刚在Eclipse中找到了Hierarchy Viewer!它也适用于真实设备。只需打开透视图Windows->打开透视图->层次结构视图在列表中,您可以看到所有连接的设备和仿真器以及活动堆栈。此外,在树形视图中,您可以看到有关视图本身的更多信息。

编辑:层次结构查看器将仅适用于开发人员设备。生产设备出于安全原因不能这样做。有关更多信息,请查看以下答案


4
层次结构查看器用于查看活动的视图层次结构。问题是关于任务/活动堆栈
杰里米·洛根

8

有关最近任务的列表

adb shell dumpsys activity recents

有关正在运行的服务的列表

adb shell dumpsys activity services

有关当前内容提供商的列表

adb shell dumpsys activity providers

对于广播状态列表

adb shell dumpsys activity broadcasts

有关待定意向的列表

adb shell dumpsys activity intents

有关权限列表

adb shell dumpsys activity permissions

如果您希望使用更多GUI-sh方式,则可以使用AdbCommander插件并在macros选项卡中添加这些命令
prot0n


1

解决方案:“ adb shell dumpsys活动”不适用于TabActivity。选择每个选项卡项目后,将启动相应的活动。但是当使用'adb shell dumpsys activity'时,它总是返回'main'活动:

public class main extends TabActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.e("xyz", "start main...............");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Resources res = getResources(); // Resource object to get Drawables
        TabHost tabHost = getTabHost();  // The activity TabHost
        TabHost.TabSpec spec;  // Resusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab

        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, widgets.class);
        spec = tabHost.newTabSpec("Widgets").setIndicator("Widgets", res.getDrawable(R.drawable.tab1)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, layouts.class);
        spec = tabHost.newTabSpec("Layouts").setIndicator("Layouts",res.getDrawable(R.drawable.tab2)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, composite1.class);
        spec = tabHost.newTabSpec("Composite").setIndicator("Composite",res.getDrawable(R.drawable.tab3)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, imageMedia.class);
        spec = tabHost.newTabSpec("Image_Media").setIndicator("Image&Media",res.getDrawable(R.drawable.tab4)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, timeDate.class);
        spec = tabHost.newTabSpec("Time_Date").setIndicator("Time&Date",res.getDrawable(R.drawable.tab5)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, transitions.class);
        spec = tabHost.newTabSpec("Transitions").setIndicator("Transitions",res.getDrawable(R.drawable.tab6)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, advanced.class);
        spec = tabHost.newTabSpec("Advanced").setIndicator("Advanced",res.getDrawable(R.drawable.tab7)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, others.class);
        spec = tabHost.newTabSpec("Others").setIndicator("Others",res.getDrawable(R.drawable.tab8)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, Dynamic.class);
        spec = tabHost.newTabSpec("Dynamic").setIndicator("Dynamic",res.getDrawable(R.drawable.tab2)).setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(0);

    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.