Compartilhar via


Passo a passo: salvar o estado da atividade

Abordamos a teoria por trás do estado de salvamento no guia do ciclo de vida da atividade; Agora, vamos a um exemplo.

Passo a passo do estado da atividade

Vamos abrir o projeto ActivityLifecycle_Start, compilá-lo e executá-lo. Este é um projeto muito simples que tem duas atividades para demonstrar o ciclo de vida da atividade e como os vários métodos de ciclo de vida são chamados. Quando você inicia o aplicativo, a tela de MainActivity é exibida:

Atividade Uma tela

Exibindo transições de estado

Cada método neste exemplo grava na janela de saída do aplicativo IDE para indicar o estado da atividade. (Para abrir a janela de saída no Visual Studio, digite CTRL-ALT-O; para abrir a janela de saída no Visual Studio para Mac, clique em Exibir > Saída do Aplicativo Pads>.)

Quando o aplicativo é iniciado pela primeira vez, a janela de saída exibe as alterações de estado da Atividade A:

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

Quando clicamos no botão Iniciar Atividade B, vemos a Atividade A pausar e parar enquanto a Atividade B passa por suas alterações de estado:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.SecondActivity] Activity B - OnCreate
[ActivityLifecycle.SecondActivity] Activity B - OnStart
[ActivityLifecycle.SecondActivity] Activity B - OnResume
[ActivityLifecycle.MainActivity] Activity A - OnStop

Como resultado, a Atividade B é iniciada e exibida no lugar da Atividade A:

Tela de atividade B

Quando clicamos no botão Voltar, a Atividade B é destruída e a Atividade A é retomada:

[ActivityLifecycle.SecondActivity] Activity B - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnRestart
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume
[ActivityLifecycle.SecondActivity] Activity B - OnStop
[ActivityLifecycle.SecondActivity] Activity B - OnDestroy

Adicionando um contador de cliques

Em seguida, vamos alterar o aplicativo para que tenhamos um botão que conte e exiba o número de vezes que ele é clicado. Primeiro, vamos adicionar uma _counter variável de instância a MainActivity:

int _counter = 0;

Em seguida, vamos editar o arquivo de layout Resource/layout/Main.axml e adicionar um novo clickButton que exibe o número de vezes que o usuário clicou no botão. O Main.axml resultante deve ser semelhante ao seguinte:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/myButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/mybutton_text" />
    <Button
        android:id="@+id/clickButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/counterbutton_text" />
</LinearLayout>

Vamos adicionar o seguinte código ao final do método OnCreate em – esse código manipula eventos de clickButtonclique do MainActivity :

var clickbutton = FindViewById<Button> (Resource.Id.clickButton);
clickbutton.Text = Resources.GetString (
    Resource.String.counterbutton_text, _counter);
clickbutton.Click += (object sender, System.EventArgs e) =>
{
    _counter++;
    clickbutton.Text = Resources.GetString (
        Resource.String.counterbutton_text, _counter);
} ;

Quando compilamos e executamos o aplicativo novamente, aparece um novo botão que incrementa e exibe o valor de _counter em cada clique:

Adicionar contagem de toques

Mas quando giramos o dispositivo para o modo paisagem, essa contagem é perdida:

Girar para paisagem define a contagem de volta a zero

Examinando a saída do aplicativo, vemos que a Atividade A foi pausada, interrompida, destruída, recriada, reiniciada e, em seguida, retomada durante a rotação do modo retrato para o modo paisagem:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

Como a Atividade A é destruída e recriada novamente quando o dispositivo é girado, seu estado de instância é perdido. Em seguida, adicionaremos código para salvar e restaurar o estado da instância.

Adicionando código para preservar o estado da instância

Vamos adicionar um método para MainActivity salvar o estado da instância. Antes que a Atividade A seja destruída, o Android chama automaticamente OnSaveInstanceState e passa um Bundle que podemos usar para armazenar nosso estado de instância. Vamos usá-lo para salvar nossa contagem de cliques como um valor inteiro:

protected override void OnSaveInstanceState (Bundle outState)
{
    outState.PutInt ("click_count", _counter);
    Log.Debug(GetType().FullName, "Activity A - Saving instance state");

    // always call the base implementation!
    base.OnSaveInstanceState (outState);    
}

Quando a Atividade A é recriada e retomada, o Android passa isso Bundle de volta para o nosso OnCreate método. Vamos adicionar código para OnCreate restaurar o _counter valor do passado Bundle. Adicione o seguinte código logo antes da linha onde clickbutton é definido:

if (bundle != null)
{
    _counter = bundle.GetInt ("click_count", 0);
    Log.Debug(GetType().FullName, "Activity A - Recovered instance state");
}

Crie e execute o aplicativo novamente e clique no segundo botão algumas vezes. Quando giramos o dispositivo para o modo paisagem, a contagem é preservada!

Girar a tela mostra a contagem de quatro preservados

Vamos dar uma olhada na janela de saída para ver o que aconteceu:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - Saving instance state
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - Recovered instance state
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

Antes do método OnStop ser chamado, nosso novo OnSaveInstanceState método era chamado para salvar o _counter valor em um Bundlearquivo . O Android nos passou isso Bundle de volta quando chamou nosso OnCreate método, e pudemos usá-lo para restaurar o _counter valor de onde paramos.

Resumo

Nesta caminhada, porém, usamos nosso conhecimento do Ciclo de Vida da Atividade para preservar os dados de estado.