Alterações do estado da atividade

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:

  1. onPause()
  2. onStop()
  3. onDestroy()

Uma nova instância da atividade é criada, e os seguintes callbacks são acionados:

  1. onCreate()
  2. onStart()
  3. onResume()

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.