Просмотр стека действий задачи
Я только начал разрабатывать простое приложение для Android, пока еще изучаю платформу.
Я использую Eclipse IDE с плагином ADT 0.9.6.
Мне нужно знать, можно ли просмотреть стек Activity
, связанный с задачей?
Есть ли какой-либо способ с помощью инструмента DDMS или любой другой техники?
По сути, мне нужно иметь возможность видеть активность стека задачи, чтобы убедиться, что приложение ведет себя как ожидалось.
Я знаю, что возможно контролировать поведение задачи в некоторой степени за счет использования флагов в объекте Intent
и через некоторые атрибуты элемента <activity>
.
Однако было бы неплохо иметь какой-то инструмент - особенно в режиме отладки или около того - это позволит разработчикам видеть стек Activity
прямо вперед.
Ответы
Ответ 1
В командной строке вы можете использовать: 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
Ответ 2
Вы можете использовать следующую команду в командной строке, чтобы увидеть задачи и backstacks в системе:
adb shell dumpsys activity activities | sed -En -e '/Stack #/p' -e '/Running activities/,/Run #0/p'
Или вы можете попробовать TaskLogger, простой инструмент, который я создал, который может отслеживать все действия и задачи в вашем приложении и выводить их в Logcat в режиме реального времени.
Ответ 3
Я знаю, что это старый вопрос, но эта функция теперь испечена в Android Studio:
![снимок экрана студии Android]()
Затем в результирующем текстовом файле найдите ACTIVITY
(все кепки):
![скриншот файла сценария для Android]()
Ответ 4
Если вы хотите проверить стек задачи определенного пакета, выполните следующую команду:
adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist
Ответ 5
Я всегда проверяю эту часть сообщений с длинными дампами.
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 - это действие, которое вы видите сейчас на экране.:)
Ответ 6
Вы можете использовать инструмент hierarchyviewer.bat. Это часть SDK android. Однако он работает только с эмулятором. Но он намного удобнее и яснее.
Изменить: я только что нашел средство просмотра иерархии в Eclipse! И он также работает с реальными устройствами. Просто откройте перспективу Windows- > Open Perspective- > Hierarchy View
В списке вы можете увидеть все подключенные устройства и эмуляторы и стек активности. Кроме того, в виде дерева вы можете увидеть гораздо больше информации о самом представлении.
Изменить:
Средство просмотра иерархии будет работать только с устройствами разработчика. Производственные устройства не могут сделать это по соображениям безопасности. Для получения дополнительной информации см. следующий ответ
Ответ 7
Список недавних задач
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
Ответ 8
Решение: "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);
}
}