page.title=Recriando uma atividade page.tags=ciclo de vida da atividade helpoutsWidget=true trainingnavtop=true @jd:body

Esta lição ensina a

  1. Salvar o estado da atividade
  2. Restaurar o estado da atividade

Leia também

Estas são algumas possibilidade onde a atividade é destruída devido ao comportamento normal do aplicativo, como quando o usuário pressiona o botão Voltar ou sua atividade sinaliza sua própria destruição chamando {@link android.app.Activity#finish()}. O sistema também pode destruir a atividade se for interrompida e não tiver sido utilizada por um longo período de tempo ou a atividade do primeiro plano exigir mais recursos, então, o sistema deverá fechar processos de segundo plano para recuperar memória.

Quando a atividade é destruída porque o usuário pressiona Voltar ou a atividade se encerra, o conceito do sistema de que a instância {@link android.app.Activity} se perde porque o comportamento indica que a atividade já não é necessária. No entanto, se o sistema destruir a atividade devido a limitações do sistema (em vez do comportamento normal do aplicativo), embora a instância real {@link android.app.Activity} tenha se perdido, o sistema lembra que ela existiu de forma que se o usuário navegar de volta, o sistema criará uma nova instância da atividade usando um conjunto de dados salvos que descrevem o estado da atividade quando foi destruída. Os dados salvos utilizados pelo sistema para restaurar o estado anterior é chamado de “estado da instância” e é uma coleção de pares de valores-chave armazenados no objeto {@link android.os.Bundle}.

Cuidado: a atividade é destruída e recriada cada vez que o usuário girar a tela. Quando a tela altera a orientação, o sistema destrói e recria a atividade de primeiro plano porque a configuração da tela mudou e a atividade talvez precise carregar recursos alternativos (como o layout).

Por padrão, o sistema usa o estado da instância {@link android.os.Bundle} para salvar informações sobre cada objeto {@link android.view.View} em seu layout de atividade (como o valor do texto informado em um objeto {@link android.widget.EditText}). Assim, se a instância da atividade for destruída e recriada, o estado do layout é restaurado em seu estado anterior sem que haja necessidade de códigos. No entanto, sua atividade pode conter mais informações de estado do que se deseja restaurar, como varáveis de membro que rastreiam o progresso do usuário na atividade.

Observação: para que o sistema Android restaure o estado das visualizações em sua atividade, cada visualização precisa ter uma ID exclusiva, fornecido pelo atributo {@code android:id}.

Para salvar dados adicionais sobre o estado da atividade, substitua o método de retorno de chamada {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}. O sistema chama este método quando o usuário sai da atividade e transmite o objeto{@link android.os.Bundle}, que será salvo caso a atividade seja destruída inesperadamente. Se o sistema precisar recriar a instância da atividade posteriormente, transmitirá o mesmo objeto {@link android.os.Bundle} para ambos os métodos {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} e {@link android.app.Activity#onCreate onCreate()} .

Figura 2. Conforme o sistema começa a interromper a atividade, ele chama {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}(1) para que você possa especificar outros dados de estado que gostaria de salvar caso a instância {@link android.app.Activity} precise ser recriada. Se a atividade for destruída e a mesma instância precisar ser recriada, o sistema transmite os dados do estado definidos em (1) para ambos os métodos {@link android.app.Activity#onCreate onCreate()} (2) e {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} (3).

Salvar o estado da atividade

Conforme a atividade é interrompida, o sistema chama {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} para que a atividade possa salvar informações de estado com uma coleção de pares de valor-chave. A implementação padrão deste método salva informações sobre o estado da hierarquia de exibições da atividade, como o texto em um widget {@link android.widget.EditText} ou a posição de rolagem de um {@link android.widget.ListView}.

Para salvar informações de estado adicionais para a atividade, implemente {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} e adicione pares de valor-chave ao objeto {@link android.os.Bundle}. Por exemplo:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
    
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

Cuidado: sempre chame a implementação de superclasse de {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} para que a implementação padrão possa salvar o estado da hierarquia de exibições.

Restaurar o estado da atividade

Quando a atividade é recriada depois de ter sido destruída, é possível recuperar o estado salvo do {@link android.os.Bundle} que o sistema transmitiu a atividade. Ambos os métodos de retorno de chamada {@link android.app.Activity#onCreate onCreate()} e {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} recebem o mesmo {@link android.os.Bundle} que contém informações do estado da instância.

Como o método {@link android.app.Activity#onCreate onCreate()} é chamado se o sistema estiver criando uma nova instância da atividade ou recriando uma anterior, verifique se o {@link android.os.Bundle} do estado é null antes de tentar realizar a leitura. Se for null, o sistema estará criando uma nova instância da atividade em vez de restaurar uma anterior que tenha sido destruída.

Por exemplo, esta é uma forma de restaurar alguns dados de estado no {@link android.app.Activity#onCreate onCreate()}:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first
   
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

Em vez de restaurar o estado durante {@link android.app.Activity#onCreate onCreate()}, você pode implementar {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}, que o sistema chama depois do método {@link android.app.Activity#onStart()}. O sistema chama {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} se houver um estado salvo para ser restaurado. Portanto, não é necessário verificar se {@link android.os.Bundle} é null:

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);
   
    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

Cuidado: sempre chame a implementação de superclasse de {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} para que a implementação padrão possa restaurar o estado da hierarquia de exibições.

Para saber mais sobre recriação de atividades devido a um evento de reinicialização no tempo de execução (como quando a tela gira), consulte Tratar alterações no tempo de execução.