Переглянути стек активності Завдання


138

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

Я використовую Eclipse IDE з плагіном ADT 0.9.6.

Мені потрібно знати, чи можна переглянути Activityстек, пов’язаний із Завданням?

Чи є спосіб через інструмент DDMS або через будь-яку іншу техніку?

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

Я знаю, що можна керувати поведінкою завдання в деякій мірі за допомогою використання прапорів в Intentоб’єкті та за допомогою деяких атрибутів <activity>елемента.

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


Якщо ви використовуєте Android Studio, я опублікував рішення [тут] [1]. [1]: stackoverflow.com/a/22392616/1798991
Небу

Відповіді:


164

З командного рядка ви можете використовувати: adb shell dumpsys activity

Це вимагає від менеджера діяльності надрукувати дамп його поточного стану. Перша частина - це повна історія діяльності, організована за завданням. Після цього також надруковано багато матеріалів, тому вам може знадобитися трохи прокрутити вгору, щоб знайти те, що ви хочете.

Ось приклад його результату (точний вміст варіюється в різних версіях платформи), показуючи, що головне завдання - це контакти з двома видами діяльності, а позаду - пускова установка з однією діяльністю:

Діяльність у поточному штаті керівника діяльності:
  * Запис завдань {44d07218 # 4 android.task.contacts}
    clearOnBackground = справжня кількістьActivities = 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
        запускаєтьсяFromUid = 10004 додаток = 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 = помилкове завдання = Завдання запису {44d07218 # 4 android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .ViewContactActivity
        base = / система / додаток / Contacts.apk / system / app / Contacts.apk data = / data / data / com.android.contacts
        labelRes = 0x7f090012 значок = 0x7f02006b тема = 0x7f0e0004
        stateNotNeeded = false falseSpecified = false isHomeActivity = false
        конфігурація = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 клавіші = 2/1/2 nav = 2/2 orien = 1 макет = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = Улюблений результатCode = 2
        launchFailed = false haveState = false icicle = null
        state = RESUMED зупиняється = false false delay.Поновити = помилкове завершення = false
        keysPaused = false inHistory = true persistent = false falseMode = 0
        повноекранний = вірно видимий = справжній замороженийBeforeDestroy = помилковий мініатюрNeeded = false false idle = true
        waitVisible = false nowVisible = true
    * Hist # 7: HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity}
        packageName = com.android.contacts processName = android.process.acore
        запускаєтьсяFromUid = 10004 додаток = 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 = справжнє завдання = TaskRecord {44d07218 # 4 android.task.contacts}
        taskAffinity = android.task.contacts
        realActivity = com.android.contacts / .DialtactsActivity
        base = / система / додаток / Contacts.apk / system / app / Contacts.apk data = / data / data / com.android.contacts
        iconRes = 0x7f090007 значок = 0x7f02006b тема = 0x7f0e0000
        stateNotNeeded = false falseSpecified = true isHomeActivity = false
        конфігурація = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 клавіші = 2/1/2 nav = 2/2 orien = 1 макет = 34}
        startFailed = false haveState = true icicle = Пакет [mParcelledData.dataSize = 4196]
        state = STOPPED зупинено = true затриманоResume = помилкове завершення = false
        keysPaused = false falseHistory = true persistent = false falseMode = 2
        повноекранний = вірно видимий = помилково замороженийBeforeDestroy = помилковий мініатюрNeeded = false false idle = true
  * Запис завдань {44c4ee90 # 2 com.android.launcher}
    clearOnBackground = справжня кількістьActivities = 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 (неактивний протягом 73483 с)
    * Hist # 6: HistoryRecord {44c4d988 com.android.launcher / .Launcher}
        packageName = com.android.launcher processName = android.process.acore
        запускається FromUid = 0 додаток = 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 = справжнє завдання = 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
        iconRes = 0x7f0a0000 значок = 0x7f020015 тема = 0x103005f
        stateNotNeeded = true компонентSpecified = false isHomeActivity = true
        конфігурація = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 клавіші = 2/1/2 nav = 2/2 orien = 1 макет = 34}
        launchFailed = false haveState = true icicle = Пакет [mParcelledData.dataSize = 5964]
        state = STOPPED зупинено = true затриманоResume = помилкове завершення = false
        keysPaused = false falseHistory = true persistent = false falseMode = 2
        повноекранний = вірно видимий = помилково замороженийBeforeDestroy = помилковий мініатюрNeeded = false false idle = true

чи є хороший спосіб показати всі стеки завдань та заходів поточного додатку через logcat? чи дійсно нам потрібно розібрати команду adb?
андроїд розробник

85
Крім того, якщо ви хочете бачити лише ім'я дій у стеку, ви можете зробити це: adb shell <enter> dumpsys activity | grep -i run .
Сурія Віджая Маджід

6
Чудова відповідь! Я написав зручний сценарій, який фільтрує вихід, щоб отримати завдання / дії для даного пакету.
sschuberth

5
на додаток adb shell dmpsys activityви можете отримати для кожного списку, наприклад, adb shell dmpsys activity activitiesДІЯЛЬНІСТЬ УПРАВЛІННЯ ДІЯЛЬНІСТЮ, що містить основний стек, Запуск діяльності та останні завдання. dumpsys activity intentsна очікувані наміри; dumpsys activity broadcastsдля стану мовлення; dumpsys activity providersдля контент-провієрів; dumpsys activity servicesза послуги; dumpsys activity processesдля запуску процесів.
Фредрік Гаус

1
@ Команду SuryaWijayaMadjid можна виконати в одному рядку: adb shell dumpsys activity | grep -i runабо adb shell dumpsys activity activities | grep -i runдля трохи більш чистого виводу.
vaughandroid

58

Ви можете використовувати таку команду у своєму командному рядку, щоб побачити завдання та backstacks у системі:

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

Або ви можете спробувати TaskLogger - простий інструмент, який я створив, який може контролювати всі дії та завдання у вашому додатку та виводити їх у Logcat в режимі реального часу.


+1 .... Я спробував ваш TaskLogger, це гарний інструмент і дуже допомагає мені, але друкує лавину небажаних журналів.
ThinkDeep

34

Я знаю, що це давнє запитання, але ця функціональність тепер використовується в Android Studio:

скріншот андроїд-студії

Потім в отриманому текстовому файлі знайдіть ACTIVITY(усі літери):

скріншот текстового файлу андроїд-студії


20
Я думаю, що ця опція більше не існує, оскільки нове вікно Android Profiler в Android Studio 3.0 замінює інструменти Android Monitor.
фрукти

5
Я створив проблему для цієї відсутньої функції: issueetracker.google.com/isissue/77944626, тому, будь ласка, проголосуйте за неї. Спасибі
mtrakal

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
Що таке "довгі дамп-повідомлення"?
Marian Paździoch

2
@ MarianPaździoch "adb shell dumpsys activity" показує нам занадто довгі повідомлення. Ці повідомлення вище, трохи їх. До речі, я отримав підказку, чи можна цього уникнути. Виконайте це, "Adb shell dumpsys Activity activities" Ви можете бачити коротше повідомлення та легше читати про стек діяльності. :)
cmcromance

1
... і якщо цей список все ще занадто довгий, відкрийте список останніх програм і проведіть пальцями деякі завдання.
Баррі Фрутман

10

Ви можете використовувати інструмент hierarchyviewer.bat. Він є частиною Android SDK. Однак він працює лише з емулятором. Але це набагато зручніше і зрозуміліше.

Редагувати: Я щойно знайшов переглядач ієрархії в Eclipse! І це працює і з реальними пристроями. Просто відкрийте перспективу 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", вона завжди повертає "основну" діяльність:

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

    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.