Ver la pila de actividades de la tarea

138

Recién comencé a desarrollar una aplicación simple de Android mientras todavía estoy aprendiendo la plataforma.

Estoy usando Eclipse IDE con el complemento ADT 0.9.6.

¿Necesito saber si es posible ver la Activitypila asociada con una tarea?

¿Hay alguna forma de utilizar la herramienta DDMS o alguna otra técnica?

Esencialmente, lo que necesito es poder ver la actividad de la pila de una tarea para asegurarme de que la aplicación se comporte como se esperaba.

Sé que es posible controlar el comportamiento de la tarea en cierta medida mediante el uso de banderas en el Intentobjeto y a través de algunos atributos del <activity>elemento.

Sin embargo, sería bueno tener un tipo de herramienta, especialmente en modo de depuración, que permitiría a los desarrolladores ver la Activitypila directamente.

Micrófono
fuente
Si está utilizando Android Studio, he publicado una solución [aquí] [1]. [1]: stackoverflow.com/a/22392616/1798991
Nebu

Respuestas:

164

Desde la línea de comandos, puede usar: adb shell dumpsys activity

Esto le pide al administrador de actividades que imprima un volcado de su estado actual. La primera parte de eso es el historial completo de la actividad, organizado por tarea. También hay muchas cosas impresas después de eso, por lo que es posible que deba desplazarse un poco hacia arriba para encontrar lo que desea.

Aquí hay un ejemplo de su salida (el contenido exacto varía según las versiones de la plataforma), que muestra que la tarea principal son los contactos con dos actividades, y detrás del iniciador con una actividad:

Actividades en el estado actual del administrador de actividades:
  * TaskRecord {44d07218 # 4 A android.task.contacts}
    clearOnBackground = true numActivities = 2 rootWasReset = true
    afinidad = 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 (inactivo durante 14s)
    * 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}
        Intención {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
        configuración = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 teclas = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = favoritos resultCode = 2
        launchFailed = false haveState = false icicle = null
        estado = REANUDADO detenido = falso retraso Reanudar = falso acabado = falso
        keysPaused = false inHistory = true persistent = false launchMode = 0
        pantalla completa = 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
        launchFromUid = 10004 app = ProcessRecord {44c4f348 1168: android.process.acore / 10004}
        Intención {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
        configuración = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 teclas = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
        estado = DETENIDO detenido = verdadero retrasado Reanudar = falso acabado = falso
        keysPaused = false inHistory = true persistent = false launchMode = 2
        pantalla completa = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false idle = true
  * TaskRecord {44c4ee90 # 2 A com.android.launcher}
    clearOnBackground = true numActivities = 1 rootWasReset = true
    afinidad = 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 (inactivo para 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}
        Intención {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
        configuración = {scale = 1.0 imsi = 310/4 loc = en_US touch = 3 teclas = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
        estado = DETENIDO detenido = verdadero retrasado Reanudar = falso acabado = falso
        keysPaused = false inHistory = true persistent = false launchMode = 2
        pantalla completa = true visible = false frozenBeforeDestroy = false thumbnailNeeded = false idle = true
hackbod
fuente
¿Hay una buena manera de mostrar todas las tareas y actividades de la aplicación actual a través de logcat? ¿realmente necesitamos analizar el comando adb?
Desarrollador de Android
85
Además, si solo desea ver el nombre de las actividades en la pila, puede hacer esto: adb shell <enter> dumpsys activity | grep -i run .
Surya Wijaya Madjid
66
¡Gran respuesta! He escrito un script de conveniencia que filtra la salida para obtener las tareas / actividades para un paquete dado.
sschuberth
55
Además adb shell dmpsys activity, puede obtener para cada lista, por ejemplo, adb shell dmpsys activity activitiesACTIVIDADES DE GESTIÓN DE ACTIVIDADES que contiene la pila principal, Actividades en ejecución y Tareas recientes. dumpsys activity intentspara intentos pendientes; dumpsys activity broadcastspara estado de difusión; dumpsys activity providerspara contenido contenido; dumpsys activity servicespara servicios; dumpsys activity processespara ejecutar procesos.
Fredrick Gauss
1
El comando de @ SuryaWijayaMadjid se puede hacer en una línea: adb shell dumpsys activity | grep -i runo adb shell dumpsys activity activities | grep -i runpara una salida ligeramente más limpia.
vaughandroid
58

Puede usar el siguiente comando en su línea de comando para ver las tareas y las pilas en el sistema:

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

O puede probar TaskLogger , una herramienta simple que creé que puede monitorear todas las actividades y tareas en su aplicación, y generarlas en Logcat en tiempo real.

Gerald.K
fuente
+1 .... He probado su TaskLogger, es una buena herramienta y me ayuda mucho, pero imprime una avalancha de registros no deseados.
ThinkDeep
34

Sé que esta es una vieja pregunta, pero esta funcionalidad ahora está integrada en Android Studio:

captura de pantalla de android studio

Luego, en el archivo de texto resultante, busque ACTIVITY(todo en mayúsculas):

captura de pantalla del archivo de texto de Android Studio

tir38
fuente
20
Creo que esta opción ya no existe ya que la nueva ventana de Android Profiler en Android Studio 3.0 reemplaza las herramientas de Android Monitor.
Fruta
55
Creé un problema para esta función faltante: issuetracker.google.com/issues/77944626, así que vote por ella. Gracias
mtrakal
27

Si desea inspeccionar la pila de tareas de un paquete específico, el siguiente comando lo hará:

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

Siempre reviso esta parte de los mensajes de volcado largos ...

  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}

Nota: La ejecución n. ° 4 es la actividad que ve ahora en la pantalla. :)

cmcromance
fuente
2
¿Qué son los "mensajes de volcado largos"?
Marian Paździoch
2
@ MarianPaździoch "actividad de adb shell dumpsys" también nos muestra mensajes LARGOS. Este mensaje, arriba, es un poco de ellos. Por cierto, recibí un consejo para evitar esto. Ejecute esto, "actividades de actividad de adb shell dumpsys". Puede ver mensajes más cortos y puede leer más fácilmente sobre la pila de actividades. :)
cmcromance
1
... y si esa lista sigue siendo demasiado larga, abra la lista de aplicaciones recientes y deslice algunas tareas.
Barry Fruitman
10

Puede usar la herramienta hierarchyviewer.bat. Es parte del SDK de Android. Sin embargo, solo funciona con el emulador. Pero es mucho más cómodo y más claro.

Editar: ¡Acabo de encontrar el Visor de jerarquía dentro de Eclipse! Y también funciona con dispositivos reales. Simplemente abra la perspectiva Windows-> Abrir perspectiva-> Vista de jerarquía En la lista puede ver todos los dispositivos y emuladores conectados y la pila de actividades. Y además, en la vista de árbol, puede ver mucha más información sobre la vista en sí.

Editar: El visor de jerarquía solo funcionará con dispositivos de desarrollador. Los dispositivos de producción no pueden hacerlo por razones de seguridad. Para obtener más información, consulte la siguiente respuesta

Xazen
fuente
44
El visor de jerarquía es para ver la jerarquía de vista de una actividad. La pregunta era sobre la pila de tareas / actividades .
Jeremy Logan
8

Para la lista de tareas recientes

adb shell dumpsys activity recents

Para la lista de servicios en ejecución

adb shell dumpsys activity services

Para la lista de proveedores de contenido actuales

adb shell dumpsys activity providers

Para la lista de estado de difusión

adb shell dumpsys activity broadcasts

Para la lista de intenciones pendientes

adb shell dumpsys activity intents

Para la lista de permisos

adb shell dumpsys activity permissions
Prasad
fuente
Si desea más GUI-sh, puede usar el AdbCommandercomplemento y agregar esos comandos en la macrospestaña
prot0n
1

Solución: 'adb shell dumpsys activity' no funciona con TabActivity. Cuando se selecciona cada elemento de la pestaña, se iniciará la actividad correspondiente. Pero cuando usa 'adb shell dumpsys activity' Siempre devuelve la actividad '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
fuente