Afficher la pile d'activités de la tâche

138

Je viens de commencer à développer une application Android simple pendant que j'apprends encore la plate-forme.

J'utilise Eclipse IDE avec le plugin ADT 0.9.6.

J'ai besoin de savoir s'il est possible d'afficher la Activitypile associée à une tâche?

Existe-t-il un moyen d'utiliser l'outil DDMS ou toute autre technique?

Ce dont j'ai essentiellement besoin, c'est de pouvoir voir l'activité de la pile d'une tâche pour m'assurer que l'application se comporte comme prévu.

Je sais qu'il est possible de contrôler le comportement de la tâche dans une certaine mesure grâce à l'utilisation d'indicateurs dans l' Intentobjet et à travers certains attributs de l' <activity>élément.

Cependant, il serait bien d'avoir une sorte d'outil - en particulier en mode débogage - qui permettrait aux développeurs de voir la Activitypile directement.

Micro
la source
Si vous utilisez Android Studio, j'ai publié une solution [ici] [1]. [1]: stackoverflow.com/a/22392616/1798991
Nebu

Réponses:

164

Depuis la ligne de commande, vous pouvez utiliser: adb shell dumpsys activity

Cela demande au gestionnaire d'activités d'imprimer un vidage de son état actuel. La première partie est l'historique complet des activités, organisé par tâche. Il y a aussi beaucoup de choses imprimées après cela, vous devrez donc peut-être faire défiler un peu pour trouver ce que vous voulez.

Voici un exemple de sa sortie (le contenu exact varie selon les versions de la plate-forme), montrant la tâche principale étant les contacts avec deux activités, et derrière cela le lanceur avec une activité:

Activités dans l'état actuel du gestionnaire d'activités:
  * 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 (inactif pendant 14 s)
    * Hist # 8: HistoryRecord {44b87a30 com.android.contacts / .ViewContactActivity}
        packageName = com.android.contacts processName = android.process.acore
        launchFromUid = 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 icône = 0x7f02006b thème = 0x7f0e0004
        stateNotNeeded = false componentSpecified = false isHomeActivity = false
        configuration = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 touches = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = favoris resultCode = 2
        launchFailed = false haveState = false icicle = null
        état = REPRISE arrêté = faux retardé Reprise = faux finition = faux
        keysPaused = false inHistory = true persistent = false launchMode = 0
        fullscreen = true visible = true FrozenBeforeDestroy = false miniatureNeeded = false idle = true
        waitVisible = false nowVisible = true
    * Hist # 7: HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity}
        packageName = com.android.contacts processName = android.process.acore
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        Intention {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 icône = 0x7f02006b thème = 0x7f0e0000
        stateNotNeeded = false componentSpecified = true isHomeActivity = false
        configuration = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 touches = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        état = STOPPED arrêté = vrai retardé Reprise = faux finition = faux
        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
    affinité = 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 (inactif pendant 73483s)
    * Hist # 6: HistoryRecord {44c4d988 com.android.launcher / .Launcher}
        packageName = com.android.launcher processName = android.process.acore
        launchFromUid = 0 app = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        Intention {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 thème = 0x103005f
        stateNotNeeded = true componentSpecified = false isHomeActivity = true
        configuration = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 touches = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        état = STOPPED arrêté = vrai retardé Reprise = faux finition = faux
        keysPaused = false inHistory = true persistent = false launchMode = 2
        fullscreen = true visible = false FrozenBeforeDestroy = false thumbnailNeeded = false idle = true
hackbod
la source
Existe-t-il un bon moyen d'afficher toutes les tâches et activités de la pile de l'application actuelle via logcat? avons-nous vraiment besoin d'analyser la commande adb?
développeur android
85
De plus, si vous souhaitez uniquement voir le nom des activités dans la pile, vous pouvez le faire: adb shell <enter> dumpsys activity | grep -i run .
Surya Wijaya Madjid
6
Très bonne réponse! J'ai écrit un script pratique qui filtre la sortie pour obtenir les tâches / activités d'un package donné.
sschuberth
5
en plus de adb shell dmpsys activityvous pouvez obtenir pour chaque liste par exemple adb shell dmpsys activity activitiespour ACTIVITY MANAGER ACTIVITIES qui contient la pile principale, les activités en cours et les tâches récentes. dumpsys activity intentspour les intentions en attente; dumpsys activity broadcastspour l'état de diffusion; dumpsys activity providerspour les fournisseurs de contenu; dumpsys activity servicespour les services; dumpsys activity processespour exécuter des processus.
Fredrick Gauss le
1
La commande de @ SuryaWijayaMadjid peut être exécutée sur une seule ligne:, adb shell dumpsys activity | grep -i runou adb shell dumpsys activity activities | grep -i runpour une sortie légèrement plus claire.
vaughandroid
58

Vous pouvez utiliser la commande suivante dans votre ligne de commande pour voir les tâches et les backstacks dans le système:

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

Ou vous pouvez essayer TaskLogger , un outil simple que j'ai créé qui peut surveiller toutes les activités et tâches de votre application et les afficher dans Logcat en temps réel.

Gerald.K
la source
+1 .... J'ai essayé votre TaskLogger c'est un bon outil et m'aide beaucoup, mais imprime une avalanche de journaux indésirables.
ThinkDeep
34

Je sais que c'est une vieille question, mais cette fonctionnalité est maintenant intégrée à Android Studio:

capture d'écran du studio android

Ensuite, dans le fichier texte résultant, recherchez ACTIVITY(en majuscules):

Capture d'écran du fichier texte du studio Android

tir38
la source
20
Je pense que cette option n'existe plus puisque la nouvelle fenêtre Android Profiler dans Android Studio 3.0 remplace les outils Android Monitor.
Fruit du
5
J'ai créé un problème pour cette fonction manquante: issuetracker.google.com/issues/77944626 , merci de voter. Merci
mtrakal
27

Si vous souhaitez inspecter la pile de tâches d'un package spécifique, la commande suivante fera l'affaire:

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist
Neevek
la source
12

Je vérifie toujours cette partie des longs messages de vidage.

  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}

Remarque: la course n ° 4 est l'activité que vous voyez maintenant à l'écran. :)

cmcromance
la source
2
Que sont les "messages de vidage longs"?
Marian Paździoch
2
@ MarianPaździoch "l'activité adb shell dumpsys" nous montre aussi des messages LONGS. Ce message, ci-dessus, en est un peu. Au fait, j'ai un conseil pour éviter cela. Exécutez ceci, "adb shell dumpsys activity activities". Vous pouvez voir un message plus court et lire plus facilement sur la pile d'activités. :)
cmcromance
1
... et si cette liste est encore trop longue, ouvrez la liste des applications récentes et faites glisser certaines tâches.
Barry Fruitman
10

Vous pouvez utiliser l'outil hierarchyviewer.bat. Il fait partie du SDK Android. Cela ne fonctionne qu'avec l'émulateur. Mais c'est beaucoup plus confortable et plus clair.

Edit: Je viens de trouver le visualiseur de hiérarchie dans Eclipse! Et cela fonctionne également avec de vrais appareils. Ouvrez simplement la perspective Windows-> Ouvrir la perspective-> Vue hiérarchique Dans la liste, vous pouvez voir tous les périphériques et émulateurs connectés ainsi que la pile d'activités. Et en plus, dans l'arborescence, vous pouvez voir beaucoup plus d'informations sur la vue elle-même.

Modifier: la visionneuse de hiérarchie fonctionnera uniquement avec les appareils de développement. Les appareils de production ne peuvent pas le faire pour des raisons de sécurité. Pour plus d'informations, veuillez consulter la réponse suivante

Xazen
la source
4
La visionneuse de hiérarchie sert à afficher la hiérarchie de vue d'une activité. La question portait sur la pile de tâches / activités .
Jeremy Logan
8

Pour la liste des tâches récentes

adb shell dumpsys activity recents

Pour la liste des services en cours d'exécution

adb shell dumpsys activity services

Pour la liste des fournisseurs de contenu actuels

adb shell dumpsys activity providers

Pour la liste des états de diffusion

adb shell dumpsys activity broadcasts

Pour la liste des intentions en attente

adb shell dumpsys activity intents

Pour la liste des permissions

adb shell dumpsys activity permissions
Prasad
la source
Si vous aimez plus GUI-sh, vous pouvez utiliser le AdbCommanderplugin et ajouter ces commandes dans macrostab
prot0n
1

Solution: «l'activité adb shell dumpsys» ne fonctionne pas avec TabActivity. Lorsque chaque élément de l'onglet est sélectionné, l'activité correspondante sera lancée. Mais lorsque vous utilisez 'adb shell dumpsys activity', il renvoie toujours l'activité '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);

    }
}
Pyraman
la source