2010-03-14 4 views
106

Я только начал разрабатывать простое приложение для Android, пока я еще изучаю платформу.Просмотреть стек активности задачи

Я использую Eclipse IDE с плагином ADT 0.9.6.

Мне нужно знать, можно ли просмотреть стек Activity, связанный с задачей?

Есть ли какой-либо способ с помощью инструмента DDMS или любой другой техники?

По существу, мне нужно, чтобы можно было видеть активность стека задачи, чтобы убедиться, что приложение ведет себя так, как ожидалось.

Я знаю, что можно контролировать поведение задачи в некоторой степени за счет использования флагов в объекте Intent и через некоторые атрибуты элемента <activity>.

Однако было бы неплохо иметь какой-то инструмент - особенно в режиме отладки или около того - это позволит разработчикам видеть стек Activity прямо вперед.

+0

Если вы используете Android Studio, я разместил решение [здесь] [1]. [1]: http://stackoverflow.com/a/22392616/1798991 – Nebu

+0

эта ссылка может помочь вам http://stackoverflow.com/questions/3873659/android-how-can-i-get -the-current-foreground-activity-from-a-service –

ответ

140

Из командной строки, вы можете использовать: 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 
+0

есть ли хороший способ показать все задачи и действия в текущем приложении через logcat? действительно ли нам нужно разбирать команду adb? –

+59

Кроме того, если вы хотите видеть только название деятельности в стеке, вы можете сделать это: 'adb shell' ** **' dumpsys activity | grep -i run'. –

+5

Отличный ответ! Я написал [удобный скрипт] (https://github.com/sschuberth/dev-scripts/blob/master/android/show_tasks.sh), который фильтрует вывод для получения задач/действий для данного пакета. – sschuberth

10

Вы можете использовать инструмент hierarchyviewer.bat. Это часть SDK android. Однако он работает только с эмулятором. Но он намного удобнее и яснее.

Редактировать: Я только что нашел средство просмотра иерархии в Eclipse! И он также работает с реальными устройствами. Просто откройте перспективу Windows-> Open Perspective-> Hierarchy View В списке вы можете увидеть все подключенные устройства и эмуляторы и стек активности. Кроме того, в виде дерева вы можете увидеть гораздо больше информации о самом представлении.

Редактировать: Средство просмотра иерархии будет работать только с устройствами разработчика. Производственные устройства не могут сделать это по соображениям безопасности. Для получения дополнительной информации, пожалуйста, посмотрите на following answer

+4

Hierarchy Viewer предназначен для просмотра иерархии представления активности. Вопрос был о [стеке задач/действий] (http://developer.android.com/guide/components/tasks-and-back-stack.html). –

11

Я всегда проверяю эту часть долго автосамосвалов сообщений ..

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 является деятельность, что вы сейчас видите на экране. :)

+1

Что такое «длинные сообщения о дампах»? –

+1

@ MarianPaździoch "Активность adb shell dumpsys" показывает нам слишком длинные сообщения. Эти сообщения, приведенные выше, немного из них. Кстати, я получил подсказку, чтобы избежать этого. Запустите это, «действия активности dumpsys оболочки adb». Вы можете видеть более короткое сообщение и можете легче узнать о стеке действий. :) – cmcromance

+1

... и если этот список еще слишком длинный, откройте список последних приложений и отбросьте некоторые задачи. –

1

Решение: «Активность dumpsys оболочки adb» не работает с TabActivity. Когда выбран каждый элемент табуляции, будет запущена соответствующая операция.Но когда польза «dumpsys ADB оболочки активность» Это всегда возвращает «основной» деятельности:

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); 

} 

}

30

Вы можете использовать следующую команду в командной строке, чтобы увидеть задачи и backstacks в системе:

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

Или вы можете попробовать TaskLogger, простой инструмент, который я создал, который может отслеживать все действия и задачи в вашем приложении, и выводить их в LogCat в режиме реального времени.

+0

+1 .... Я пробовал свой TaskLogger, это хороший инструмент и помогает мне много, но печатает лавину нежелательных журналов. – ThinkDeep

4

Если вы хотите, чтобы проверить стек задачи конкретного пакета, то следующая команда:

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist 
22

Я знаю, что это старый вопрос, но, эта функция теперь запеченные в Android Studio:

android studio screenshot

Затем в полученном текстовом файле, поиск ACTIVITY (все заглавные буквы):

android studio text file screenshot

+6

Я думаю, что этот вариант больше не существует, так как новое окно Android Profiler в Android Studio 3.0 заменяет инструменты Android Monitor. –

2

Для списка последних задач

adb shell dumpsys activity recents 

Перечень услуг работает

adb shell dumpsys activity services 

Для списка текущих поставщиков контента

adb shell dumpsys activity providers 

Для списка Broadcast состояние

adb shell dumpsys activity broadcasts 

В списке Pending намерениях

adb shell dumpsys activity intents 

Для списка разрешений

adb shell dumpsys activity permissions 
+0

Если вам нравится больше GUI-sh, вы можете использовать плагин AdbCommander и добавлять эти команды на вкладке «макросы» – prot0n

Смежные вопросы