首页 文章

查看任务的活动堆栈

提问于
浏览
117

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

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

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

有没有办法通过DDMS工具或通过任何其他技术?

基本上我需要的是能够看到任务的堆栈活动,以确保应用程序按预期运行 .

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

然而,拥有一种工具会很好 - 尤其是在调试模式下 - 这样可以让开发人员直接看到 Activity 堆栈 .

8 回答

  • 10

    从命令行,您可以使用: 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
    
  • 24

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

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

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

  • 43

    我知道这是一个老问题但是,此功能现已融入Android Studio:

    android studio screenshot

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

    android studio text file screenshot

  • 1

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

    adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist
    
  • 2

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

    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}
    

    Note: Run #4 is the activity that you see now on the screen. :)

  • 149

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

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

    编辑:层次结构查看器仅适用于开发人员设备 . 出于安全原因, 生产环境 设备无法执行此操作 . 欲了解更多信息,请查看following answer

  • 11

    对于最近的任务列表

    adb shell dumpsys activity recents
    

    对于正在运行的服务列表

    adb shell dumpsys activity services
    

    对于当前内容提供商的列表

    adb shell dumpsys activity providers
    

    对于广播状态列表

    adb shell dumpsys activity broadcasts
    

    对于Pending Intents列表

    adb shell dumpsys activity intents
    

    对于权限列表

    adb shell dumpsys activity permissions
    
  • 15

    解决方案:'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);
    
    }
    

    }

相关问题