Compartir a través de


Tutorial: guardado del estado de actividad

Hemos tratado la teoría de guardar el estado en la guía ciclo de vida de la actividad; ahora, veamos un ejemplo.

Tutorial de estado de actividad

Vamos a abrir el proyecto ActivityLifecycle_Start, compilarlo y ejecutarlo. Se trata de un proyecto muy sencillo que tiene dos actividades para demostrar el ciclo de vida de la actividad y cómo se llama a los distintos métodos de ciclo de vida. Al iniciar la aplicación, se muestra la pantalla de MainActivity:

Pantalla de Actividad A

Visualización de transiciones de estado

Cada método de este ejemplo escribe en la ventana de salida de la aplicación IDE para indicar el estado de actividad. (Para abrir la ventana de salida en Visual Studio, escriba CTRL-ALT-O; para abrir la ventana de salida en Visual Studio para Mac, haga clic en Ver > Rellenos > Salida de la aplicación).

Cuando se inicia la aplicación por primera vez, la ventana de salida muestra los cambios de estado de la actividad A:

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

Al hacer clic en el botón Iniciar actividad B, vemos que la actividad A se pausa y se detiene mientras la actividad B pasa por sus cambios 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, se inicia la actividad B y se muestra en lugar de la actividad A:

Pantalla de Actividad B

Al hacer clic en el botón Atrás , se destruye la actividad B y se reanuda la actividad A:

[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

Agregar un contador de clics

A continuación, vamos a cambiar la aplicación para que tengamos un botón que cuente y muestre el número de veces que se hace clic en ella. En primer lugar, vamos a agregar una variable de instancia _counter a MainActivity:

int _counter = 0;

A continuación, vamos a editar el archivo de diseño Resource/layout/Main.axml y agregaremos un nuevo clickButton que muestre el número de veces que el usuario ha hecho clic en el botón. El archivo Main.axml resultante debe ser similar al siguiente:

<?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 a agregar el código siguiente al final del método OnCreate en MainActivity: este código controla los eventos de clic de clickButton:

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);
} ;

Cuando compilamos y ejecutamos la aplicación de nuevo, aparece un nuevo botón que aumenta y muestra el valor de _counter en cada clic:

Agregar recuento de entradas táctiles

Pero cuando giramos el dispositivo al modo horizontal, este recuento se pierde:

Al rotar de manera horizontal, se establece el recuento en cero

Al examinar la salida de la aplicación, vemos que la actividad A se ha pausado, detenido, destruido, vuelto a crear, reiniciado y, a continuación, se reanuda durante la rotación del modo vertical al horizontal:

[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

Dado que la actividad A se destruye y vuelve a crear cuando se gira el dispositivo, se pierde su estado de instancia. A continuación, agregaremos código para guardar y restaurar el estado de la instancia.

Adición de código para conservar el estado de la instancia

Vamos a agregar un método a MainActivity para guardar el estado de la instancia. Antes de que se destruya la actividad A, Android llama automáticamente a OnSaveInstanceState y pasa un paquete que podemos usar para almacenar el estado de la instancia. Vamos a usarlo para guardar el recuento de clics como un valor entero:

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);    
}

Cuando se vuelve a crear y reanudar la actividad A, Android vuelve a pasar este Bundle al método OnCreate. Vamos a agregar código a OnCreate para restaurar el valor _counter de la aplicación pasada Bundle. Agregue el código siguiente justo antes de la línea donde se define clickbutton:

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

Vuelva a compilar y ejecutar la aplicación y, a continuación, haga clic en el segundo botón varias veces. Cuando giramos el dispositivo al modo horizontal, se conserva el recuento.

Al rotar la pantalla, se muestra el recuento en cuatro conservado

Echemos un vistazo a la ventana de salida para ver lo que ha ocurrido:

[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 de llamar al método OnStop, se llamó a nuestro nuevo método OnSaveInstanceState para guardar el valor _counter en Bundle. Android nos volvió a pasar este Bundle cuando llamó al método OnCreate y pudimos usarlo para restaurar el valor _counter donde lo dejamos.

Resumen

En este tutorial, hemos usado nuestro conocimiento del ciclo de vida de la actividad para conservar los datos de estado.