Zeigen Sie den Aktivitätsstapel der Aufgabe an

138

Ich habe gerade angefangen, eine einfache Android-Anwendung zu entwickeln, während ich noch die Plattform lerne.

Ich verwende Eclipse IDE mit dem ADT-Plugin 0.9.6.

Ich muss wissen, ob es möglich ist, den ActivityStapel anzuzeigen, der einer Aufgabe zugeordnet ist.

Gibt es einen Weg durch das DDMS-Tool oder durch eine andere Technik?

Im Wesentlichen muss ich die Stapelaktivität einer Aufgabe sehen können, um sicherzustellen, dass sich die Anwendung wie erwartet verhält.

Ich weiß, dass es möglich ist, das Aufgabenverhalten in gewissem Maße durch die Verwendung von Flags im IntentObjekt und durch einige Attribute des <activity>Elements zu steuern .

Es wäre jedoch schön, eine Art Tool zu haben - insbesondere im Debug-Modus oder so -, mit dem Entwickler den ActivityStack direkt sehen können.

Mic
quelle
Wenn Sie Android Studio verwenden, habe ich eine Lösung [hier] [1] veröffentlicht. [1]: stackoverflow.com/a/22392616/1798991
Nebu

Antworten:

164

Über die Befehlszeile können Sie Folgendes verwenden: adb shell dumpsys activity

Dadurch wird der Aktivitätsmanager aufgefordert, einen Speicherauszug seines aktuellen Status zu drucken. Der erste Teil davon ist der vollständige Aktivitätsverlauf, geordnet nach Aufgaben. Danach werden auch viele Dinge gedruckt, sodass Sie möglicherweise ein wenig nach oben scrollen müssen, um das zu finden, was Sie wollen.

Hier ist ein Beispiel für die Ausgabe (der genaue Inhalt variiert je nach Plattformversion). Die Hauptaufgabe sind Kontakte mit zwei Aktivitäten und dahinter der Launcher mit einer Aktivität:

Aktivitäten im aktuellen Status des Aktivitätsmanagers:
  * TaskRecord {44d07218 # 4 A android.task.contacts}
    clearOnBackground = true numActivities = 2 rootWasReset = true
    Affinität = 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 Sekunden inaktiv)
    * 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}
        Absicht {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 = de_DE touch = 3 Tasten = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = Favoriten resultCode = 2
        launchFailed = false haveState = false icicle = null
        state = RESUMED gestoppt = false verzögertResume = falsch beendet = false
        keysPaused = false inHistory = true persistent = false launchMode = 0
        Vollbild = wahr sichtbar = wahr eingefrorenBeforeDestroy = falsch thumbnailNeeded = falsch Leerlauf = wahr
        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}
        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 = de_DE touch = 3 Tasten = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        state = STOPPED gestoppt = wahr verzögertResume = falsch beendet = falsch
        keysPaused = false inHistory = true persistent = false launchMode = 2
        Vollbild = wahr sichtbar = falsch eingefrorenBeforeDestroy = falsch thumbnailNeeded = falsch Leerlauf = wahr
  * TaskRecord {44c4ee90 # 2 Ein com.android.launcher}
    clearOnBackground = true numActivities = 1 rootWasReset = true
    Affinität = 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 (inaktiv für 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}
        Absicht {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10000000 cmp = com.android.launcher / .Launcher}
        frontOfTask = true task = TaskRecord {44c4ee90 # 2 Ein 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 = de_DE touch = 3 Tasten = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        state = STOPPED gestoppt = wahr verzögertResume = falsch beendet = falsch
        keysPaused = false inHistory = true persistent = false launchMode = 2
        Vollbild = wahr sichtbar = falsch eingefrorenBeforeDestroy = falsch thumbnailNeeded = falsch Leerlauf = wahr
Hackbod
quelle
Gibt es eine gute Möglichkeit, alle Aufgaben und Aktivitäten der aktuellen App über logcat anzuzeigen? Müssen wir den Befehl adb wirklich analysieren?
Android-Entwickler
85
Wenn Sie nur den Namen der Aktivitäten im Stapel anzeigen möchten, können Sie Folgendes tun: adb shell <Eingabe> dumpsys activity | grep -i run .
Surya Wijaya Madjid
6
Gute Antwort! Ich habe ein Convenience-Skript geschrieben, das die Ausgabe filtert, um die Aufgaben / Aktivitäten für ein bestimmtes Paket abzurufen.
Sschuberth
5
Darüber hinaus adb shell dmpsys activitykönnen Sie für jede Liste beispielsweise adb shell dmpsys activity activitiesACTIVITY MANAGER-AKTIVITÄTEN abrufen, die den Hauptstapel, Ausführen von Aktivitäten und Letzte Aufgaben enthalten. dumpsys activity intentsfür ausstehende Absichten; dumpsys activity broadcastsfür den Sendezustand; dumpsys activity providersfür Inhaltsanbieter; dumpsys activity servicesfür Dienstleistungen; dumpsys activity processeszum Ausführen von Prozessen.
Fredrick Gauss
1
Der Befehl von @ SuryaWijayaMadjid kann in einer Zeile ausgeführt werden: adb shell dumpsys activity | grep -i runoder adb shell dumpsys activity activities | grep -i runfür eine etwas sauberere Ausgabe.
Vaughandroid
58

Sie können den folgenden Befehl in Ihrer Befehlszeile verwenden, um die Aufgaben und Backstacks im System anzuzeigen:

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

Sie können auch TaskLogger ausprobieren , ein einfaches Tool, das ich erstellt habe und das alle Aktivitäten und Aufgaben in Ihrer App überwachen und in Echtzeit in Logcat ausgeben kann.

Gerald.K
quelle
+1 .... Ich habe Ihren TaskLogger ausprobiert, er ist ein gutes Werkzeug und hilft mir sehr, druckt aber eine Lawine unerwünschter Protokolle.
ThinkDeep
34

Ich weiß, dass dies eine alte Frage ist, aber diese Funktionalität ist jetzt in Android Studio integriert:

Android Studio Screenshot

Suchen Sie dann in der resultierenden Textdatei nach ACTIVITY(Großbuchstaben):

Screenshot der Android Studio-Textdatei

tir38
quelle
19
Ich denke, diese Option existiert nicht mehr, da das neue Android Profiler-Fenster in Android Studio 3.0 die Android Monitor-Tools ersetzt.
Obst
5
Ich habe ein Problem für diese fehlende Funktion erstellt: issuetracker.google.com/issues/77944626. Bitte stimmen Sie dafür ab. Danke
mtrakal
27

Wenn Sie den Taskstapel eines bestimmten Pakets überprüfen möchten, führt der folgende Befehl aus:

adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist
neevek
quelle
12

Ich überprüfe immer diesen Teil von langen Dump-Nachrichten.

  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}

Hinweis: Lauf 4 ist die Aktivität, die Sie jetzt auf dem Bildschirm sehen. :) :)

cmcromance
quelle
2
Was sind "Long Dump Messages"?
Marian Paździoch
2
@ MarianPaździoch "adb shell dumpsys activity" zeigt uns auch lange Nachrichten. Diese Nachricht oben ist ein bisschen von ihnen. Übrigens habe ich einen Tipp bekommen, der das vermeiden kann. Führen Sie Folgendes aus: "Aktivitätsaktivitäten von adb shell dumpsys". Sie können eine kürzere Meldung sehen und leichter über den Aktivitätsstapel lesen. :)
cmcromance
1
... und wenn diese Liste immer noch zu lang ist, öffnen Sie die Liste der zuletzt verwendeten Apps und wischen Sie einige Aufgaben weg.
Barry Fruitman
10

Sie können das Tool hierarchyviewer.bat verwenden. Es ist Teil des Android SDK. Es funktioniert jedoch nur mit Emulator. Aber es ist viel komfortabler und klarer.

Bearbeiten: Ich habe gerade den Hierarchie-Viewer in Eclipse gefunden! Und es funktioniert auch mit realen Geräten. Öffnen Sie einfach die Perspektive Windows-> Perspektive öffnen-> Hierarchieansicht In der Liste sehen Sie alle verbundenen Geräte und Emulatoren sowie den Aktivitätsstapel. Außerdem sehen Sie in der Baumansicht viel mehr Informationen über die Ansicht selbst.

Bearbeiten: Der Hierarchy Viewer funktioniert nur mit Entwicklergeräten. Produktionsgeräte können dies aus Sicherheitsgründen nicht. Weitere Informationen finden Sie in der folgenden Antwort

Xazen
quelle
4
Der Hierarchie-Viewer dient zum Anzeigen der Ansichtshierarchie einer Aktivität. Die Frage betraf den Aufgaben- / Aktivitätsstapel .
Jeremy Logan
8

Für die Liste der letzten Aufgaben

adb shell dumpsys activity recents

Für die Liste der ausgeführten Dienste

adb shell dumpsys activity services

Für die Liste der aktuellen Inhaltsanbieter

adb shell dumpsys activity providers

Für die Liste des Broadcast-Status

adb shell dumpsys activity broadcasts

Für die Liste der ausstehenden Absichten

adb shell dumpsys activity intents

Für die Liste der Berechtigungen

adb shell dumpsys activity permissions
Prasad
quelle
Wenn Sie mehr GUI-sh mögen, können Sie AdbCommanderPlugin verwenden und diese Befehle in macrostab hinzufügen
prot0n
1

Lösung: 'adb shell dumpsys activity' funktioniert nicht mit TabActivity. Wenn jedes Registerkartenelement ausgewählt ist, wird die entsprechende Aktivität gestartet. Bei Verwendung von 'adb shell dumpsys activity' wird jedoch immer 'main' zurückgegeben:

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
quelle