Olá, estou me perguntando como o Android está gerenciando a memória e não consigo encontrar uma resposta precisa em qualquer lugar. Vamos supor que eu tenha um aplicativo com 5 atividades na pilha de atividades atual (4 paradas e 1 retomada), não há nenhum serviço conectado. Eu pressiono o botão INÍCIO para que todas as minhas atividades sejam interrompidas. Eu inicio algum outro aplicativo que consome memória e a memória geral do dispositivo está começando a ficar baixa. E a questão é
... O que acontecerá com meu aplicativo?
- O sistema pode destruir apenas uma ou algumas das minhas atividades para recuperar a memória?
- O sistema interromperá todo o processo do meu aplicativo? Todas as atividades serão bem destruídas?
- O que acontecerá quando eu voltar ao meu aplicativo quando ele estiver totalmente desativado? Começará do início (como a primeira inicialização) ou tentará recuperar as atividades ao estado anterior / se sim - é apenas a que está no topo da pilha ou todas elas?
ATUALIZAR:
Antes de fazer esta pergunta, eu vi o ciclo de vida da atividade algumas vezes, mas não tem respostas para minhas perguntas. Fiz alguns testes e tenho algumas respostas. "Parar o processo" no DDMS era uma pista para o teste.
Não testei a resposta para a pergunta 1, mas como o guia diz:
Se uma atividade for pausada ou interrompida, o sistema pode eliminar a atividade da memória pedindo que ela seja concluída ou simplesmente eliminando seu processo.
Parece que uma ou mais atividades podem ser destruídas suavemente (com o método onDestroy) sem interromper o processo. Você simplesmente obterá (onCreate + bundle) quando voltar para eles.
Resposta da pergunta 2:
SIM. Geralmente, o sistema elimina todo o processo, o que significa que todos os dados, incluindo atividades e campos estáticos, são destruídos. Isso NÃO é feito corretamente - você não conseguirá onDestroy ou finialize () para nenhuma de suas atividades pausadas / interrompidas. É por isso que saveInstanceState () é chamado antes do método onPause. onPause é basicamente o último método em que você deve salvar algo porque depois desse método você nunca mais poderá ver onStop ou onDestroy. O sistema pode simplesmente matar o processo, destruindo todos os seus objetos, o que quer que eles contenham e o que quer que estejam fazendo.
Resposta da pergunta 3:
O que acontecerá quando você voltar para um aplicativo desativado?
- Antes do Android 2.2 - o aplicativo começará do início, com a atividade do iniciador.
- A partir de 2.2 - o sistema restaurará o estado anterior do aplicativo. O que isso significa? Isso significa que a última atividade visível será recriada (onCreate + bundle). O que acontecerá com a pilha de atividades? Stack está bem, mas todas as atividades nele estão mortas. Cada um deles será recriado (onCreate + bundle) quando você voltar a ele com o botão Voltar. Há mais uma coisa sobre isso:
Normalmente, o sistema limpa uma tarefa (remove todas as atividades da pilha acima da atividade raiz) em certas situações quando o usuário seleciona novamente essa tarefa na tela inicial. Normalmente, isso é feito se o usuário não visita a tarefa por um determinado período de tempo, como 30 minutos.
Conclusão?
- Não pense que lidar com problemas de rotação de atividades pode ser resolvido pelo android: configChanges = "idance ". Ao fazer isso, você terá muitos outros problemas dos quais nem mesmo está ciente.
- Teste seu aplicativo com DDMS - botão Parar processo. Veja isso
- Tenha cuidado ao usar variáveis estáticas. Não pense que quando você os inicializou na atividade 1 - você os terá inicializado na atividade 2. O único lugar seguro para inicializar a estática global seria a classe de aplicativo.
- Lembre-se de que você nunca verá onStop ou onDestroy. Feche arquivos / bancos de dados, pare os downloaders em onPause. Quando você quiser que o aplicativo faça algo no BG - use o serviço de primeiro plano.
Seria isso ... Espero ter ajudado com meu ensaio :)
fonte
Respostas:
Primeiro, dê uma olhada nisso:
Então, quando você pressiona o botão "HOME" no seu dispositivo, sua atividade de primeiro plano atual é colocada em
onPause()
seguidaonStop()
, os outros 4 devem permaneceronStop()
De acordo com os documentos do Google:
E, para o ciclo de vida do processo:
Todas as citações acima vêm de: Referência dos desenvolvedores Android: Atividade
É confirmado que o sistema pode destruir atividades não ativas e reciclar memórias quando você inicia alguns aplicativos que consomem memória. E você pode implementar como:
isFinishing()
em sua atividade e, em seguida, usando o botão "kill" no DDMS para detectar quais das suas atividades estão sendo descartadas pelo sistema. Mas acho que o sistema destruirá o mais antigo primeiro. No entanto, não adianta manter outras atividades quando a "Atividade de inicialização" foi reciclada.ATUALIZAR
Aqui estão algumas opiniões que encontrei aqui :
fonte
Sim. O Android elimina atividades que estão sendo executadas em segundo plano quando há necessidade de memória. Matar um ou todos pode depender de algumas condições. Por exemplo, pausado ou interrompido pode fazer o android matar uma atividade ou um processo em si. Aqui, em Ciclo de vida da atividade, você pode obter os pontos abaixo. Eu recomendo que você percorra essa página completamente. Com certeza vai tirar suas dúvidas.
A atividade pertence a um indivíduo, enquanto o processo pertence a um grupo de atividades. Observe o terceiro ponto acima novamente, ele mata o processo conforme mencionado.
É semelhante ao reiniciar. Novamente, o terceiro ponto lhe dará algumas respostas como
When it is displayed again to the user, it must be completely restarted and restored to its previous state
Obtenha mais informações sobre coisas relacionadas à memória aqui .
Editar:
todas as atividades em um aplicativo são executadas em um único processo. Portanto, quando um processo é encerrado, todas as atividades, independentemente de 5 ou 10, serão encerradas, ou seja, reiniciadas. A reinicialização fará com que seu aplicativo seja iniciado do início, sem estados salvos.
fonte