Ver la stack de actividad de la Tarea

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

Estoy usando Eclipse IDE con el plugin ADT 0.9.6.

Necesito saber si es posible ver la stack de Activity asociada a una tarea.

¿Hay algún camino a través de la herramienta DDMS o mediante cualquier otra técnica?

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

Sé que es posible controlar el comportamiento de la tarea en cierta medida mediante el uso de indicadores en el objeto Intent y mediante algunos atributos del elemento .

Sin embargo, sería bueno tener un tipo de herramienta, especialmente en modo de depuración, que permita a los desarrolladores ver la stack de Activity directa.

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 actividades, organizado por tarea. También hay muchas cosas impresas después de eso, por lo que es posible que deba desplazarse un poco para encontrar lo que desea.

Aquí hay un ejemplo de su salida (los contenidos exactos varían según las versiones de la plataforma), mostrando que la tarea principal son los contactos con dos actividades, y detrás de eso, el iniciador con una actividad:

 Actividades en el estado del administrador de actividad actual:
   * TaskRecord {44d07218 # 4 A android.task.contacts}
     clearOnBackground = true numActivities = 2 rootWasReset = true
     affinity = android.task.contacts
     bash = {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 por 14 segundos)
     * Hist # 8: HistoryRecord {44b87a30 com.android.contacts / .ViewContactActivity}
         packageName = com.android.contacts processName = android.process.acore
         releasedFromUid = 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 = {escala = 1.0 imsi = 310/4 loc = en_US táctil = 3 teclas = 2/1/2 nav = 2/2 orien = 1 diseño = 34}
         resultTo = HistoryRecord {44d174d0 com.android.contacts / .DialtactsContactsEntryActivity} resultWho = favoritos resultCode = 2
         launchFailed = falso haveState = false icicle = null
         state = RESUMED stopped = false retaryedResume = false finishing = false
         keysPaused = falso enHistory = true persistent = falso 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
         releasedFromUid = 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 = {escala = 1.0 imsi = 310/4 loc = en_US táctil = 3 teclas = 2/1/2 nav = 2/2 orien = 1 diseño = 34}
         launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 4196]
         state = STOPPED stopped = true retrayedResume = false finishing = false
         keysPaused = falso enHistory = true persistent = falso launchMode = 2
         fullscreen = true visible = falso 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
         releasedFromUid = 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 = {escala = 1.0 imsi = 310/4 loc = en_US táctil = 3 teclas = 2/1/2 nav = 2/2 orien = 1 diseño = 34}
         launchFailed = false haveState = true icicle = Bundle [mParcelledData.dataSize = 5964]
         state = STOPPED stopped = true retrayedResume = false finishing = false
         keysPaused = falso enHistory = true persistent = falso launchMode = 2
         fullscreen = true visible = falso frozenBeforeDestroy = false thumbnailNeeded = false idle = true

Puede usar el siguiente comando en su línea de comando para ver las tareas y backstacks 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 sencilla que he creado que puede controlar todas las actividades y tareas en su aplicación y enviarlas en Logcat en tiempo real.

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 (mayúsculas):

Captura de pantalla de archivo de texto de estudio Android

Siempre controlo 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: Ejecutar # 4 es la actividad que ves ahora en la pantalla. 🙂

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 funciona con dispositivos reales también. Simplemente abra la perspectiva Windows-> Abrir Perspectiva-> Vista de Jerarquía En la lista puede ver todos los dispositivos y emuladores conectados y la stack de actividades. 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, eche un vistazo a la siguiente respuesta

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

 adb shell dumpsys activity activities | grep PACKAGE_NAME | grep Hist 

Para la lista de tareas recientes

 adb shell dumpsys activity recents 

Para la lista de Servicios que se ejecutan

 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 Intentos Pendientes

 adb shell dumpsys activity intents 

Para la lista de permisos

 adb shell dumpsys activity permissions 

solución: ‘adb shell dumpsys activity’ no funciona con TabActivity. Cuando se selecciona cada elemento de tabulación, se iniciará la actividad correspondiente. Pero cuando usas ‘actividad de shell dumpsys’, siempre devuelve actividad ‘principal’:

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

}