Ciclo de Vida de uma Activity — Fases, Métodos, Prioridades dos Processos e Liberação de Recursos

Fases e Métodos

Tássio Auad
Younger Auad
4 min readFeb 20, 2015

--

Da mesma forma que em contêineres de servlet Java EE, a Activity responde a invocações do framework do Android ao invés de conduzir ciclo de vida da forma que o desenvolvedor desejar e implementar. Então, a plataforma Android controla toda a vida de uma Activity, e em cada fase dessa vida útil é invocado um ou mais métodos callbacks da classe, permitindo assim que o desenvolvedor implemente seu código seguindo as fases. Há três fases na vida útil de uma Activity:

  • Fase de primeiro plano — Quando a Activity está visível para o usuário e é possível interagir com ela.
  • Fase visível — Quando a Activity está visível, porém não é possível interagir com ela. É possível encontrar essa fase quando um Dialog é aberto sobre a Activity, onde a Activity é visível por baixo dessa Dialog, porém a interação é possível de ocorrer apenas no Dialog.
  • Fase de segundo plano — Quando a Activity não está visível e obviamente não é possível interagir com ela

Como já dito, em cada uma dessas fases o framework invoca da classe alguns métodos, que podem ser vistos nas duas imagens abaixo:

Ciclo de Vida de uma Activity — Imagem 1

Ciclo de Vida de uma Activity — Imagem 2

Tentando enxergar de uma maneira diferente, podemos relacionar fases e métodos da seguinte forma. Vamos imaginar a inicialização de uma Activity e algumas possíveis situações que encontramos após isso:

  • Iniciando uma Activity — Activity na Fase de Primeiro Plano
  • Activity.onCreate() -> Activity.onStart() -> Activity.onResume()
  • Depois disso, abrimos um Dialog sobre a Activity — Activity na Fase Visível
  • Activity.onPause()
  • Depois de interagirmos como Dialog, ele é fechado — Activity volta para a Fase de Primeiro Plano
  • Activity.onResume()
  • Depois vamos imaginar que uma Activity2 seja invocada — Activity vai para a Fase de Segundo Plano
  • Activity.onPause() -> Activity.onStop()
  • O usuário clica no botão de voltar e nossa Activity volta a interação — Activity volta para a Fase de Primeiro Plano
  • Activity.onRestart() -> Activity.onResume()
  • Activity por algum motivo é destruida — Activity destruida
  • Activity.onPause() -> Activity.onStop()

Prioridades de Processos e Liberação de Recursos

Cada Activity é colocada em um processo pela plataforma, e será essa plataforma que conduzirá a vida de uma Activity. Será ela também quem decidirá quando precisa liberar recursos por falta de memória e quem decidirá quais processos devem ser eliminados para que isso ocorra. Nesse procedimento, é seguido uma lista de prioridades de processos, sendo que os processos com menos prioridade são os mais suscetíveis a eliminação.

Lista de Prioridades dos Processos

  1. Processo que hospeda uma Activity de primeiro plano.
  2. Qualquer processo que hospede uma Activity que esteja visível mas não em primeiro plano .
  3. Processos que hospedem Activities de segundo plano.
  4. Processos que não hospedam alguma Activity ou BroadcastReceiver ou Service, que são chamados de Processos Vazios.

Então, na ordem inversa dessa lista temos os tipos de processos dos mais suscetíveis a eliminação aos processos menos suscetíveis. Mediante isso, deve-se ter em mente o que é citado no livro:

“Todas as classes Activity devem ser capazes de ser interrompidas e desativadas a qualquer momento. Lembre-se, um usuário pode e vai mudar o que está fazendo à vontade. Eles podem receberuma chamada telefônica ou uma mensagem SMS, fazendo com que pulem de uma aplicativo para o outro à vontade. Se o processo em que sua Activity está cair para segundo plano, ele pode ser desativado sem seu consentimento; depende do algoritmo da plataforma, baseado nos recursos disponíveis e prioridades relativas.” — Android em Ação, 3ª Edição, Editora Campus

Enquanto se desenvolve uma tela de um aplicativo, deve-se haver a preocupação não só da inicialização da Activity e do seu relacionamento com toda a parte visual e com a interação do usuário, mas também com seu possível “desligamento”, seja pela troca repentina de aplicativos, ou seja, quando o usuário deixar de usar o seu para usar um outro naquele instante, seja pela liberação de recursos, caso o processo dessa Activity não esteja em uma situação muita importância para a plataforma, ou mesmo quando no mesmo aplicativo o usuário solicitar outra Activity.

Pensando “desligamento” de uma Activity, em um post anterior eu fiz um comentário a respeito do método onPause() que também foi extraído do mesmo livro “Android em Ação”. Como lembrete, o ciclo de vida até o onPause() é priorizado em qualquer circunstância pelo sistema operacional, até mesmo quando ele estiver eliminando activities por falta de recursos. Por exemplo, os métodos onStop() e onDestroy() podem não ser invocados quando uma Activity estiver sendo eliminada, porém, independente da situação o método onPause() é invocados sempre. Então os autores do livro aconselham a ver o onPause() como última oportunidade. Deve-se fazer o que tem que se feito nele para se preparar inclusive para uma eliminação repentina da activity da memória.

“É importante saber que onPause() é sua última oportunidade para limpar e salvar informações de estado. Os processos que hospedam suas classes Activity não serão finalizados pela plataforma até que o método onPause() tenha sido completado, mas eles podem ser finalizados depois disso. O sistema vai tentar rodas todos os métodos do ciclo de vida a cada vez, mas se os recursos diminuírem criticamente, os processos que estão hospedando activities que além do método onPause() podem ser finalizados em qualquer ponto.” Android em Ação, 3ª Edição, Editora Campus

--

--

Tássio Auad
Younger Auad

Christian, Mobile Developer, Tea Drinker, Caffeine Dependent Life-Form