查看任务的活动堆栈

我刚开始开发一个简单的Android应用程序,而我还在学习这个平台。

我正在使用Eclipse IDE和ADT插件0.9.6。

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

有没有通过DDMS工具或任何其他技术的方式?

基本上我需要的是能够看到一个任务的堆栈活动,以确保应用程序的行为如预期。

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

不过,有一种工具 – 特别是在debugging模式下 – 这样可以让开发人员直接看到Activity堆栈。

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

这要求活动pipe理器打印当前状态的转储。 第一部分是完整的活动历史,由任务组织。 之后还会打印很多东西,所以您可能需要向上滚动一下才能find您想要的东西。

以下是其输出示例(具体内容因平台版本而异),显示了与两项活动联系的首要任务,以及后面的具有一项活动的启动程序:

当前活动pipe理器状态中的活动:
   * TaskRecord {44d07218#4 A android.task.contacts}
     clearOnBackground = true numActivities = 2 rootWasReset = true
    亲和力= 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秒)
     * Hist#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}
         Intent {act = android.intent.action.VIEW dat = content://com.android.contacts/contacts/lookup/144i148.144i461a29500afc8eeb/1927 cmp = com.android.contacts / .ViewContactActivity}
         frontOfTask = false任务= 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 icon = 0x7f02006b theme = 0x7f0e0004
         stateNotNeeded = false componentSpecified = false isHomeActivity = false
        configuration= {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 keys = 2/1/2 nav = 2/2 orien = 1 layout = 34}
         resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = favorites resultCode = 2
         launchFailed = false haveState = false icicle = null
         state = RESUMED stopped = false delayedResume = false finishing = false
         keysPaused = false inHistory = true persistent = false launchMode = 0
         fullscreen = true visible = true frozenBeforeDestroy = false thumbnailNeeded = false idle = true
         waitingVisible = false nowVisible = true
     * Hist#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}
         Intent {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10200000 cmp = com.android.contacts / .DialtactsContactsEntryActivity bnds = [125,640] [235,758]}
         frontOfTask = true任务= 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 icon = 0x7f02006b theme = 0x7f0e0000
         stateNotNeeded = false componentSpecified = true isHomeActivity = false
        configuration= {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 keys = 2/1/2 nav = 2/2 orien = 1 layout = 34}
         launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        状态=停止停止=真delayedResume =假整理=假
         keysPaused = false inHistory = true persistent = false launchMode = 2
         fullscreen = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false idle = true
   * TaskRecord {44c4ee90#2 com.android.launcher}
     clearOnBackground = true numActivities = 1 rootWasReset = true
    亲和力= 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(73483s不活跃)
     * Hist#6:HistoryRecord {44c4d988 com.android.launcher / .Launcher}
         packageName = com.android.launcher processName = android.process.acore
         launchFromUid = 0 app = ProcessRecord {44c4f348 1168:android.process.acore / 10004}
         Intent {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
        configuration= {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 keys = 2/1/2 nav = 2/2 orien = 1 layout = 34}
         launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        状态=停止停止=真delayedResume =假整理=假
         keysPaused = false inHistory = true persistent = false launchMode = 2
         fullscreen = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false idle = true

您可以使用

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

在您的命令行中查看系统中的任务和后台堆栈。

或者,您可以尝试TaskLogger ,一个我创build的简单工具,它可以监视您的应用程序中的所有活动和任务,并在Logcat中实时输出。

我知道这是一个老问题,但是现在这个function已经融入到了Android Studio中:

android studio截图

然后在生成的文本文件中searchACTIVITY (全部大写):

android studio文本文件的截图

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

  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是您现在在屏幕上看到的活动。 🙂

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

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

编辑:层次结构查看器将只能用于开发人员设备。 生产设备不能出于安全原因。 欲了解更多信息,请看下面的答案

解决scheme:“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); } 

}

如果你想检查特定包的任务堆栈,下面的命令将会执行:

 adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist 

最近的任务列表

 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