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:
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:
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 clickButton
clique 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:
Mas quando giramos o dispositivo para o modo paisagem, essa contagem é perdida:
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!
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 Bundle
arquivo . 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.