O que realmente acontece quando você desliza um aplicativo da lista de aplicativos recentes?

147

A lista de aplicativos recentes no Ice Cream Sandwich adicionou a capacidade de deslizar aplicativos para fora da lista, dispensando-os permanentemente (e, tanto quanto eu sei, essa é uma função de baunilha, não uma ROM de CM / personalizada). Os destaques da documentação e da plataforma não parecem cobrir o funcionamento básico dessa funcionalidade, mas estou curioso para saber o que o sistema está realmente fazendo.

Para aumentar ainda mais a minha curiosidade, decidi fazer um teste rápido: iniciei o Music em uma instalação do CM9 e depois recuei. Verifiquei a lista de aplicativos recentes e vi que ela estava realmente lá (e no estado adequado, com base na miniatura). Em seguida, entrei Settings->Applicationse forcei o aplicativo Música, mas ele ainda estava listado na lista recente, o que me levou a acreditar que não está conectado a processos que permanecem em segundo plano.

Percebendo agora que a música pode ter sido uma má escolha, também testei com o aplicativo USA Today. Isso exibiu basicamente o mesmo comportamento, e parecia ter sido forçado a "relançar" após a parada forçada (o que faz sentido), embora a miniatura na lista de aplicativos recentes não refletisse isso (em cache, suponho?).

Então, o que realmente acontece no nível do sistema operacional quando você tira um aplicativo da lista recente? Simplesmente limpa os dados do aplicativo da RAM e o coleta de lixo, destruindo seu estado salvo?

eldarerathis
fonte

Respostas:

68

Tirar aplicativos da lista de aplicativos recentes é baunilha e, sim, não está bem documentado. Esse foi o tópico de uma quantidade razoável de discussões em vários fóruns do Android ... o consenso parece ser melhor descrito aqui em alguns comentários : que o comportamento é semelhante, mas não exatamente o mesmo que o fechamento de um aplicativo - em geral ( para aplicativos que não definem a manipulação explícita do botão voltar), é o mesmo que recuperar vezes suficientes de dentro de um aplicativo e sair dele.

O link tem mais alguns detalhes sobre os detalhes, mas no geral, você pode pensar nisso como sair do aplicativo.

Específico ao aplicativo Música, acredito que ele inicia um serviço, portanto, enquanto a tarefa em si (o aplicativo Música / interface do usuário) pode estar fechada, o serviço continua sendo executado em segundo plano para que sua música não pare subitamente apenas porque a tarefa foi limpo por razões de gerenciamento de memória. Isso pode ter afetado o que você viu.

Austin Mills
fonte
1
Obrigado, esse link tem muita discussão boa. Você também pode ter razão: música, que pode ter sido um teste ruim. Vou tentar outro aplicativo, apenas por diversão.
28412 eldarerathis
2
Ir em frente e aceitar isso, já que a discussão no reddit me ajudou a encontrar alguns termos de pesquisa melhores e pareceu ser corroborada por alguns posts de Dianne Hackborn, que observei na minha resposta . Obrigado!
Eldarerathis 16/03/12
1
Perfeito obrigado! Para mim, este post me ajudou: reddit.com/r/Android/comments/mpevh/…
Boris Strandjev
Os players de música de terceiros, como o Rocket Player, interrompem a música quando você desliza o aplicativo da lista Recentes, mesmo que o serviço seja executado em segundo plano e você precise abrir o aplicativo ou reproduzir no widget novamente para iniciar a música.
Lucky
78

Parece que encontrei os termos mágicos de pesquisa que levaram a algumas explicações dos funcionários do Google. Especificamente, encontrei alguns lugares diferentes em que Dianne Hackborn explica o que acontece quando você tira algo da lista recente. O primeiro é um comentário em uma de suas postagens no Google+ :

O que acontece especificamente quando você desliza uma tarefa recente é: (1) elimina todos os processos em segundo plano ou vazios do aplicativo (consulte http://developer.android.com/guide/topics/fundamentals/processes-and- threads.html # Ciclo de vida do que isso significa) e (2) usa a nova http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API para informar qualquer serviços do aplicativo sobre a tarefa que está sendo removida, para que ele possa fazer o que achar apropriado.

Ela também observa em um comentário no blog :

Na verdade, a remoção de uma entrada em tarefas recentes eliminará todos os processos em segundo plano que existem para o processo. Isso não faz com que os serviços parem diretamente, no entanto, existe uma API para eles descobrirem que a tarefa foi removida para decidir se eles querem que isso signifique que eles devem parar. Isso é feito para remover, digamos, a tarefa recente de um aplicativo de email não interromper a verificação de emails.

Se você realmente deseja interromper completamente um aplicativo, pode pressionar demoradamente as tarefas recentes para acessar as informações do aplicativo e pressionar força para parar por aí. Pois parar é uma interrupção completa do aplicativo - todos os processos são interrompidos, todos os serviços interrompidos, todas as notificações removidas, todos os alarmes removidos etc. O aplicativo não tem permissão para iniciar novamente até que seja solicitado explicitamente.

Portanto, parece que o resumo é que, ao tirar um aplicativo da lista, todos os processos em segundo plano serão onTaskRemovedeliminados e depois usados para notificar o aplicativo de que a tarefa em segundo plano foi removida. Nesse ponto, parece que cabe ao aplicativo decidir o que acontece, então acho que tecnicamente não existe uma regra rígida sobre o que acontece com o aplicativo além desse ponto.

eldarerathis
fonte
Esse é certamente um comportamento não óbvio, muito interessante!
Matthew Leia
"elimine qualquer processo em segundo plano que exista para o processo. Não fará com que os serviços parem diretamente". Isso ainda é verdade? Eu fiz um teste ontem. Ontem, eu roubei um aplicativo com um serviço em segundo plano no processo principal. Os aplicativos => executando a interface do usuário mostraram 0 processos e 0 serviços. Mais tarde, varri o mesmo aplicativo com um processo em execução em um processo específico de aplicativo separado. Os aplicativos => executando a interface do usuário disseram que eu tinha 0 processos e 1 serviço. Isso foi em um Moto X (2014) com Android 4.4.4.
Steven Wexler 26/03
@StevenWexler: Pode ser que o serviço tenha terminado sozinho no primeiro caso, mas não no segundo, ou no segundo cenário o processo principal determinou (por algum motivo) que não queria interromper o serviço. Difícil saber com certeza.
eldarerathis
O serviço iniciado é iniciado automaticamente novamente após deslizar para fora da lista recente, seu onCreate é chamado novamente. mas em alguns aplicativos onCreate chamados antes em onTaskRemoved e em outros chamados após onTaskRemoved. por que esse comportamento é então?
umesh
21

Há algumas informações no código-fonte nas classes com.android.internal.policy.impl.RecentApplicationsBackground e com.android.internal.policy.impl.RecentApplicationsDialog .

Se eu os leio corretamente, existem manipuladores específicos para selecionar os aplicativos, mas nada de especial para usá-los, exceto onDetachedFromWindow(): chamadas com.android.View.onDetachedFromWindow()que basicamente ocultam o elemento e limpam seus dados. Isso sugere que nada de especial acontece ao passar o aplicativo, o que corresponde à resposta de Austin Mills, porque como a lista não mostra o aplicativo ativo, as onPause()outras chamadas do sistema feitas ao "sair" de um aplicativo têm já aconteceu.

onik
fonte
10

Eu acho que ele fará o mesmo que o botão Voltar. Exceto uma pequena mudança. Será finish()toda a atividade / fragmentos no aplicativo.

Acabei de fazer um pequeno teste com um pequeno aplicativo de auto-construção. Você pode testar também. Heres meu aplicativo de teste: https://bitbucket.org/Leandros99/lifecycletest (download disponível também. Para aqueles que não podem criar.)
Em todos os métodos de ciclo de vida de atividade ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) imprime um aplicativo ao log. Você pode visualizá-lo com o adb logcat (instale o SDK do Android, o CD nas ferramentas da plataforma em cmd / shell e digite adb logcat. Agora você verá, toda vez que fizer algo como pressionar o botão voltar ou o botão home, o aplicativo imprime o método do ciclo de vida mencionado acima. )

Sua pergunta: se eu deslizar um aplicativo da gaveta de aplicativos recentes, o onDestroymétodo será chamado. Faz quase o mesmo que o botão Voltar.
Espero ter ajudado um pouco. Se houver perguntas, basta perguntar.

Leandros
fonte
3

Ele fecha o aplicativo e seus dados armazenados na RAM. Assim, oferecendo mais espaço de RAM para que você possa executar outros aplicativos. No entanto, os serviços em segundo plano NÃO são forçados a fechar automaticamente como resultado do fechamento do aplicativo em uso.

user3067986
fonte
1
Embora escrita na linguagem cotidiana, essa é na verdade uma resposta bastante precisa - ela captura o fato de que o processo é descartado, mas muitas das outras respostas (aquelas que o comparam erroneamente com o botão voltar) estão ausentes. No entanto, o que está faltando aqui é a constatação de que o Android descartará os processos quando necessário para obter memória de qualquer maneira; portanto, enquanto realiza alguma limpeza de memória, isso aconteceria automaticamente se / quando necessário.
Chris Stratton