A sessão de perguntas e respostas de hoje nos é oferecida por cortesia do Android Enthusiast, uma subdivisão do Stack Exchange, um agrupamento de sites de perguntas e respostas conduzido pela comunidade.
A questão
O leitor do Entusiasta do Android, Eldarerathis, está curioso sobre a funcionalidade de deslizamento de aplicativo que permite que você visualize sua lista de aplicativos em execução por meio do botão "Página inicial" e, em seguida, passe-os para a direita, presumivelmente para fechá-los:
The recent apps list in Ice Cream Sandwich added the ability to swipe apps out of the list, thereby dismissing them permanently (and as far as I know this is a vanilla function, not a CM/custom ROM one). The documentation and platform highlights don’t appear to cover the under-the-hood workings of this functionality, but I’m curious to know what the system is actually doing.
Further adding to my curiosity, I decided to do a quick test: I started up Music on a CM9 install, then backed out of it. I then checked the recent apps list and saw it was indeed there (and in the proper state, based on the thumbnail). I then went into
Settings->Applications
e a força interrompeu o aplicativo "Música", mas ela ainda estava listada na lista recente, o que me levou a acreditar que ela não está conectada a processos remanescentes em segundo plano.
Percebendo agora que a música pode ter sido uma má escolha, eu também testei com o aplicativo USA Today. Isso exibiu basicamente o mesmo comportamento, e parecia que era 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 SO ao roubar um aplicativo da lista recente? Ele simplesmente limpa os dados do aplicativo da RAM e o coleta de lixo, destruindo seu estado salvo?
O que exatamente está acontecendo quando você desliza o aplicativo da lista?
As respostas
O colaborador do Android Enthusiast, Austin Mills, oferece algumas dicas:
Transferir aplicativos da lista de aplicativos recentes é baunilha e, sim, não está bem documentado. Este tem sido o tópico de uma quantidade decente de discussão 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 fechar um aplicativo - em geral não defina o tratamento explícito do botão Voltar) é a mesma coisa que retroceder bastante de dentro de um aplicativo que você sai dele.
O link tem mais detalhes sobre os detalhes, mas no geral você pode pensar nisso como sair do aplicativo.
Especificamente para o aplicativo Música, acredito que ele inicia um serviço, portanto, embora a tarefa em si (o aplicativo / interface do usuário de música) possa ser fechada, o serviço continua a ser executado em segundo plano para que sua música não pare de repente só porque a tarefa foi desmarcada por razões de gerenciamento de memória. Isso pode ter afetado o que você viu.
Então, participando do círculo de perguntas e respostas da vida, Eldarerathis voltou com algumas pesquisas para completar a resposta:
I appear to have found the magical search terms that led to some explanations from Google employees. Specifically, I found a couple of different places where Dianne Hackborn explains what happens when you swipe something out of the recent list. The first is a comment on one of her Google+ posts:
[W]hat specifically happens when you swipe away a recent task is it: (1) kills any background or empty processes of the application (see here for what this means), and (2) uses the new API to tell any services of the application about the task being removed so it can do whatever it thinks is appropriate.
She also notes in a blog comment:
Actually, removing an entry in recent tasks will kill any background processes that exist for the process. It won’t directly causes services to stop, however there is an API for them to find out the task was removed to decide if they want this to mean they should stop. This is so that removing say the recent task of an e-mail app won’t cause it to stop checking for e-mail.
If you really want to completely stop an app, you can long press on recent tasks to go to app info, and hit force stop there. Force stop is a complete kill of the app - all processes are killed, all services stopped, all notifications removed, all alarms removed, etc. The app is not allowed to launch again until explicitly requested.
So, it looks like the summary is that swiping an app out of the list will first kill all background processes for the app, then use
onTaskRemoved
para notificar o aplicativo 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 é uma regra rígida sobre o que acontece com o aplicativo além desse ponto.
Tem algo a acrescentar à explicação? Soe fora nos comentários. Quer ler mais respostas de outros usuários do Stack Exchange com experiência em tecnologia? Confira o tópico de discussão completo aqui.