Exibir a pilha de atividades da tarefa

138

Comecei a desenvolver um aplicativo Android simples enquanto ainda estou aprendendo a plataforma.

Estou usando o Eclipse IDE com o plug-in ADT 0.9.6.

Preciso saber se é possível visualizar a Activitypilha associada a uma tarefa?

Existe alguma maneira através da ferramenta DDMS ou através de qualquer outra técnica?

Basicamente, o que eu preciso é poder ver a atividade da pilha de uma tarefa para garantir que o aplicativo se comporte conforme o esperado.

Eu sei que é possível controlar o comportamento da tarefa em certa medida através do uso de sinalizadores no Intentobjeto e através de alguns atributos do <activity>elemento.

No entanto, seria bom ter um tipo de ferramenta - especialmente no modo de depuração - que permitiria aos desenvolvedores ver a Activitypilha diretamente.

Microfone
fonte
Se você estiver usando o Android Studio, eu publiquei uma solução [aqui] [1]. [1]: stackoverflow.com/a/22392616/1798991
Nebu 13/14

Respostas:

164

Na linha de comando, você pode usar: adb shell dumpsys activity

Isso solicita que o gerente de atividades imprima um despejo de seu estado atual. A primeira parte disso é o histórico de atividades completo, organizado por tarefa. Depois disso, também há muitas coisas impressas, então você pode precisar rolar um pouco para encontrar o que deseja.

Aqui está um exemplo de sua saída (o conteúdo exato varia entre as versões da plataforma), mostrando a tarefa principal sendo contatos com duas atividades e, por trás disso, o iniciador com uma atividade:

Atividades no estado atual do Gerenciador de atividades:
  * 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 (inativo por 14s)
    * História nº 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}
        Intenção {act = android.intent.action.VIEW dat = content: //com.android.contacts/contacts/lookup/144i148.144i461a29500afc8eeb/1927 cmp = com.android.contacts / .ViewContactActivity}
        frontOfTask = tarefa falsa = 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 tema = 0x7f0e0004
        stateNotNeeded = false componentSpecified = false isHomeActivity = false
        configuração = {escala = 1,0 imsi = 310/4 loc = pt_BR 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 = nulo
        state = RESUMED parado = falso delayedResume = falso acabamento = falso
        keysPaused = false inHistory = true persistente = false launchMode = 0
        tela cheia = true visível = true frozenBeforeDestroy = thumbnail thumbnailNeeded = false idle = true
        waitingVisible = false nowVisible = true
    * História nº 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}
        Intenção {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 tema = 0x7f0e0000
        stateNotNeeded = false componentSpecified = true isHomeActivity = false
        configuração = {escala = 1,0 imsi = 310/4 loc = pt_BR touch = 3 teclas = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Pacote configurável [mParcelledData.dataSize = 4196]
        state = STOPPED parado = verdadeiro delayedResume = falso acabamento = falso
        keysPaused = false inHistory = true persistente = false launchMode = 2
        tela cheia = true visível = false frozenBeforeDestroy = thumbnail 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 (inativo por 73483s)
    * História nº 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}
        Intenção {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 ícone = 0x7f020015 theme = 0x103005f
        stateNotNeeded = true componentSpecified = false isHomeActivity = true
        configuração = {escala = 1,0 imsi = 310/4 loc = pt_BR touch = 3 teclas = 2/1/2 nav = 2/2 orien = 1 layout = 34}
        launchFailed = false haveState = true icicle = Pacote configurável [mParcelledData.dataSize = 5964]
        state = STOPPED parado = verdadeiro delayedResume = falso acabamento = falso
        keysPaused = false inHistory = true persistente = false launchMode = 2
        tela cheia = true visível = false frozenBeforeDestroy = thumbnail thumbnailNeeded = false idle = true
hackbod
fonte
existe uma boa maneira de mostrar todas as tarefas e atividades da pilha do aplicativo atual via logcat? realmente precisamos analisar o comando adb?
desenvolvedor android
85
Além disso, se você quiser apenas ver o nome das atividades na pilha, faça isso: adb shell <enter> dumpsys activity | grep -i run .
Surya Wijaya Madjid
6
Ótima resposta! Eu escrevi um script de conveniência que filtra a saída para obter as tarefas / atividades de um determinado pacote.
sschuberth
5
além de adb shell dmpsys activityvocê pode obter para cada lista, por exemplo, adb shell dmpsys activity activitiesACTIVITY MANAGER ACTIVITIES que contém pilha principal, atividades em execução e tarefas recentes. dumpsys activity intentspara intenções pendentes; dumpsys activity broadcastspara estado de transmissão; dumpsys activity providerspara provedores de conteúdo; dumpsys activity servicespara serviços; dumpsys activity processespara processos em execução.
Fredrick Gauss
1
O comando do @ SuryaWijayaMadjid pode ser feito em uma linha:, adb shell dumpsys activity | grep -i runou adb shell dumpsys activity activities | grep -i runpara uma saída um pouco mais limpa.
vaughandroid
58

Você pode usar o seguinte comando em sua linha de comandos para ver as tarefas e as backstacks no sistema:

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

Ou você pode tentar o TaskLogger , uma ferramenta simples que criei que pode monitorar todas as atividades e tarefas em seu aplicativo e produzi-las no Logcat em tempo real.

Gerald.K
fonte
+1 .... Eu tentei o seu TaskLogger, é uma boa ferramenta e me ajuda muito, mas imprime uma avalanche de logs indesejados.
ThinkDeep
34

Sei que essa é uma pergunta antiga, mas essa funcionalidade agora está inserida no Android Studio:

captura de tela do android studio

Em seguida, no arquivo de texto resultante, procure ACTIVITY(todas em maiúsculas):

captura de tela do arquivo de texto do android studio

tir38
fonte
20
Acho que essa opção não existe mais, pois a nova janela do Android Profiler no Android Studio 3.0 substitui as ferramentas do Android Monitor.
Fruit
5
Criei um problema para esta função ausente: issuetracker.google.com/issues/77944626; portanto, vote nele. Graças
mtrakal
27

Se você deseja inspecionar a pilha de tarefas de um pacote específico, o seguinte comando fará:

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

Eu sempre verifico esta parte das mensagens longas de despejo ..

  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: A execução nº 4 é a atividade que você vê agora na tela. :)

cmcromance
fonte
2
O que são "mensagens longas de despejo"?
Marian Paździoch
2
@ MarianPaździoch "atividade adb shell dumpsys" nos mostra mensagens LONGAS. Essas mensagens, acima, são um pouco delas. By the way, eu tenho uma dica pode evitar isso. Execute isso, "atividades de atividade adb shell dumpsys". Você pode ver uma mensagem mais curta e ler mais facilmente sobre a pilha de atividades. :)
cmcromance
1
... e se essa lista ainda for muito longa, abra a lista Aplicativos Recentes e deslize algumas tarefas.
Barry Fruitman
10

Você pode usar a ferramenta hierarchyviewer.bat. Faz parte do SDK do Android. Só funciona com emulador. Mas é muito mais confortável e mais claro.

Edit: Acabei de encontrar o Hierarchy Viewer no Eclipse! E funciona com dispositivos reais também. Basta abrir a perspectiva Windows-> Abrir perspectiva-> Exibição de hierarquia Na lista, você pode ver todos os dispositivos e emuladores conectados e a pilha de atividades. Além disso, na visualização em árvore, você pode ver muito mais informações sobre a visualização em si.

Editar: o Hierarchy Viewer funcionará apenas com dispositivos de desenvolvedor. Os dispositivos de produção não podem fazê-lo por razões de segurança. Para mais informações, consulte a seguinte resposta

Xazen
fonte
4
O Visualizador de Hierarquia é para visualizar a hierarquia de Exibição de uma atividade. A pergunta era sobre a pilha de tarefas / atividades .
Jeremy Logan
8

Para a lista de tarefas recentes

adb shell dumpsys activity recents

Para a lista de serviços em execução

adb shell dumpsys activity services

Para obter a lista dos provedores de conteúdo atuais

adb shell dumpsys activity providers

Para a lista do estado Broadcast

adb shell dumpsys activity broadcasts

Para a lista de intenções pendentes

adb shell dumpsys activity intents

Para a lista de permissões

adb shell dumpsys activity permissions
Prasad
fonte
Se você gosta de uma maneira mais GUI-sh, pode usar o AdbCommanderplug-in e adicionar esses comandos na macrosguia
prot0n
1

Solução: 'adb shell dumpsys activity' não funciona com o TabActivity. Quando cada item da guia é selecionado, a atividade correspondente será iniciada. Mas quando usar 'adb shell dumpsys activity', ele sempre retorna a atividade '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
fonte