查看任务的活动堆栈

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

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

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

是否有任何方法通过 DDMS 工具或通过任何其他技术?

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

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

然而,如果有一种工具——尤其是在调试模式下——能够让开发人员直接看到 Activity堆栈,那就太好了。

100079 次浏览

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

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

下面是其输出的一个示例(不同平台版本的确切内容各不相同) ,显示了与两个活动的联系是最重要的任务,在此之后是与一个活动的启动程序:

Activities in Current Activity Manager State:
* TaskRecord{44d07218 #4 A android.task.contacts}
clearOnBackground=true numActivities=2 rootWasReset=true
affinity=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 (inactive for 14s)
* Hist #8: HistoryRecord{44b87a30 com.android.contacts/.ViewContactActivity}
packageName=com.android.contacts processName=android.process.acore
launchedFromUid=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 task=TaskRecord{44d07218 #4 A 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
launchedFromUid=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 task=TaskRecord{44d07218 #4 A 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]
state=STOPPED stopped=true delayedResume=false finishing=false
keysPaused=false inHistory=true persistent=false launchMode=2
fullscreen=true visible=false frozenBeforeDestroy=false thumbnailNeeded=false idle=true
* TaskRecord{44c4ee90 #2 A com.android.launcher}
clearOnBackground=true numActivities=1 rootWasReset=true
affinity=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 (inactive for 73483s)
* Hist #6: HistoryRecord{44c4d988 com.android.launcher/.Launcher}
packageName=com.android.launcher processName=android.process.acore
launchedFromUid=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 A 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 icon=0x7f020015 theme=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]
state=STOPPED stopped=true delayedResume=false finishing=false
keysPaused=false inHistory=true persistent=false launchMode=2
fullscreen=true visible=false frozenBeforeDestroy=false thumbnailNeeded=false idle=true

您可以使用这个工具  。它是 android SDK 的一部分。但它只能在模拟器中工作。但是它更加舒适和清晰。

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

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

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

  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}

注意: Run # 4是您现在在屏幕上看到的活动。 :)

解决方案: “ adb shell Dumpsys activity”不适用于 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 | sed -En -e '/Stack #/p' -e '/Running activities/,/Run #0/p'

或者你可以试试 任务记录器,这是我创建的一个简单的工具,它可以监控你应用程序中的所有活动和任务,并在 Logcat 实时输出。

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

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist

我知道这是一个老问题,但是,这个功能现在已经嵌入到 Android Studio 中:

android studio screenshot

然后在生成的文本文件中,搜索 ACTIVITY(全部大写) :

android studio text file screenshot

获取最近任务的列表

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

现在有一个插件可以做到这一点:

Https://plugins.jetbrains.com/plugin/12293-activity-stack-view

enter image description here