Просмотр стека активности задания - PullRequest
130 голосов
/ 14 марта 2010

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

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

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

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

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

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

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

Ответы [ 8 ]

157 голосов
/ 15 марта 2010

Из командной строки вы можете использовать: 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
51 голосов
/ 29 июня 2015

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

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

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

28 голосов
/ 26 апреля 2017

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

android studio screenshot

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

android studio text file screenshot

22 голосов
/ 12 апреля 2017

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

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist
11 голосов
/ 19 апреля 2013

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

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

10 голосов
/ 24 августа 2011

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

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

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

5 голосов
/ 28 сентября 2017

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

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
1 голос
/ 10 июля 2013

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

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

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...