Eventos diferentes, alguns acionados pelo usuário e outros pelo sistema, podem fazer com que uma
Activity
faça a transição de um estado para
outro. Este documento descreve alguns casos comuns em que essas transições
acontecem e como lidar com elas.
Para mais informações sobre os estados da atividade, consulte Ciclo de vida
da atividade. Para saber mais sobre como
a classe ViewModel
pode
ajudar você a gerenciar o ciclo de vida da atividade, consulte a Visão geral
do ViewModel.
Ocorre uma mudança na configuração
Há vários eventos que podem acionar uma mudança de configuração. Talvez o exemplo mais proeminente seja uma mudança entre as orientações de retrato e paisagem. Outros casos que podem causar mudanças de configuração incluem mudanças nas configurações de idioma ou no dispositivo de entrada.
Quando ocorre uma mudança na configuração, a atividade é destruída e recriada. Isso aciona os callbacks abaixo na instância da atividade original:
Uma nova instância da atividade é criada, e os seguintes callbacks são acionados:
Use uma combinação de instâncias ViewModel
, o método onSaveInstanceState()
ou
armazenamento local persistente para preservar o estado da interface de uma atividade nas mudanças de
configuração. A decisão de como combinar essas opções depende da complexidade dos
dados da interface, dos casos de uso do seu app e da consideração da velocidade de recuperação
em comparação com o uso da memória. Para saber mais sobre como salvar o estado da interface da atividade, consulte
Salvar estados da interface.
Gerenciar casos de várias janelas
Quando um app entra no modo de várias janelas, disponível no Android 7.0 (nível 24 da API) e versões mais recentes, o sistema notifica a atividade em execução sobre uma mudança de configuração, passando pelas transições do ciclo de vida descritas anteriormente.
Esse comportamento também ocorre se um app que já está no modo de várias janelas for redimensionado. Sua atividade pode processar a mudança de configuração por conta própria ou permitir que o sistema destrua a atividade e a recrie com as novas dimensões.
Para saber mais sobre o ciclo de vida de várias janelas, consulte a explicação do ciclo de vida de várias janelas na página Suporte a várias janelas.
No modo de várias janelas, embora haja dois apps visíveis para o usuário, apenas aquele com o qual a pessoa está interagindo fica em primeiro plano e em foco. Essa atividade fica no estado "Retomado", enquanto o app na outra janela está no estado Pausado.
Quando o usuário alterna do app A para o app B, o sistema chama
onPause()
no app A e
onResume()
no app B. Ela alterna
entre esses dois métodos sempre que o usuário alterna entre apps.
Para mais detalhes sobre o modo de várias janelas, consulte Suporte a várias janelas.
A atividade ou a caixa de diálogo é exibida em primeiro plano
Se uma nova atividade ou caixa de diálogo aparecer em primeiro plano, assumindo o foco e cobrindo parcialmente a atividade em andamento, a atividade encoberta perderá o foco e entrará no estado "Pausado". Em seguida, o sistema chamará
onPause()
.
Quando a atividade encoberta retorna para o primeiro plano e recupera o foco, o
sistema chama onResume()
.
Se uma nova atividade ou caixa de diálogo aparecer em primeiro plano, com foco e
cobrindo completamente a atividade em andamento, a atividade encoberta perderá o foco
e entrará no estado "Interrompido". Em seguida, o sistema chama
onPause()
e onStop()
em rápida sucessão.
Quando a mesma instância da atividade coberta retorna ao primeiro plano, o
sistema chama onRestart()
,
onStart()
e
onResume()
na atividade. Se
for uma nova instância da atividade coberta que entra em segundo plano, o
sistema não vai chamar onRestart()
, apenas
onStart()
e onResume()
.
O usuário toca ou gesticula "Voltar"
Se uma atividade estiver em primeiro plano e o usuário tocar ou gesticular "Voltar",
a atividade fará a transição pelos callbacks
onPause()
,
onStop()
e
onDestroy()
. A atividade será destruída e removida da backstack.
Por padrão, o callback
onSaveInstanceState()
não é acionado nesse caso. Esse comportamento supõe que o usuário toca em "Voltar"
sem a expectativa de retornar à mesma instância da atividade.
No entanto, você pode substituir o método
onBackPressed()
para
implementar um comportamento personalizado, como mostrar uma caixa de diálogo que pede ao usuário para
confirmar se quer sair do app.
Se você substituir o método onBackPressed()
, é
altamente recomendável invocar super.onBackPressed()
pelo
método substituído. Caso contrário, o comportamento do botão "Voltar" do sistema pode ser desagradável para o
usuário.
O sistema elimina o processo do app
Se um app estiver em segundo plano e o sistema precisar liberar memória
para um app em primeiro plano, ele poderá encerrar o app em segundo plano.
Quando o sistema encerrar um app, não há garantia de que o onDestroy()
vai ser chamado
no app.
Para saber mais sobre como o sistema decide quais processos destruir, leia Estado da atividade e expulsão da memória e Processos e ciclo de vida do app.
Para aprender a salvar o estado da interface da atividade quando o sistema encerrar o processo do app, consulte Como salvar e restaurar o estado da interface temporário.