X

Recrear una Actividad

Hay unos cuantos escenarios en los cuales tu actividad se destruye debido al comportamiento normal de la app, por ejemplo, cuando el usuario presiona el botón Atrás en tu actividad señala su propia destrucción al llamar al método finish(). El sistema también puede destruir tu actividad si actualmente se encuentra parada y no se ha utilizado durante un largo periodo de tiempo o la actividad en primer plano requiere de más recursos y, por ende, el sistema elimina procesos en segundo plano para recuperar memoria.

Cuando tu actividad se destruye porque el usuario presiona el botón Atrás o la actividad se finaliza a si misma, el sistema entiende que la instancia Activity se ha finalizado ya que dicho comportamiento indica que la actividad ya no es necesaria. Sin embargo, si el sistema destruye la actividad debido a restricciones o limitaciones del sistema (en lugar de por el comportamiento habitual de la app), entonces aunque la instancia actual de la Activity se haya ido, el sistema recuerda que existió y así si el usuario vuelve atrás hacia dicha actividad, el sistema crea una nueva instancia de la actividad utilizando un conjunto de datos guardados que describen el estado que tenía la actividad cuando fue destruida. Los datos guardados que el sistema utiliza para recuperar el estado anterior se llaman “estado de la instancia” y es un grupo de pares clave-valor almacenados en un objeto Bundle.

Precaución: Tu actividad será destruida y recreada cada vez que el usuario gira la pantalla. Cuando la pantalla cambia de orientación, el sistema destruye y recree la actividad en primer plano ya que la configuración de la pantalla ha cambiado y tu actividad necesita cargar recursos alternativos (por ejemplo el layout).

Por defecto, el sistema usa el estado de la instancia Bundle para almacenar la información de cada objeto View en el layout de tu actividad (por ejemplo el texto introducido en un objeto EditText). Así, si la instancia de tu actividad se destruye y se recrea, el estado del layout se restaura a su estado anterior sin tener que utilizar ningún código por tu parte. Sin embargo, tu actividad puede tener más información que te gustaría restaurar, por ejemplo ciertas variables que rastreaban el progreso del usuario en la actividad.

Nota: Para que el sistema Android restaure el estado de las vistas en tu actividad, cada View debe tener un ID único, suministrado mediante el atributo android:id.

Figura 1. Cuando el sistema empiece a parar tu actividad, llama a onSaveInstanceState() (1) ,así puedes especificar información adicional del estado que te gustaría guardar en caso de que la instancia Activity deba ser recreada. Si la actividad se destruye y la misma instancia debe ser recreada, el sistema transmite la información del estado definida en (1) tanto al método onCreate() (2) como a onRestoreInstanceState() (3).

Para almacenar información adicional sobre el estado de la actividad, debes sobrescribir el método onSaveInstanceState(). El sistema llama a este método cuando el usuario está abandonando tu actividad y transmite el objeto Bundle que será guardado en caso de que tu actividad se destruya de forma inesperada. Si el sistema debe recrear la instancia de la actividad más tarde, transmitirá el mismo objeto Bundle tanto al método onRestoreInstanceState() como a onCreate().

Guarda el Estado de tu Actividad

Tan pronto como tu actividad empiece a pararse, el sistema llama a onSaveInstanceState() para que tu actividad pueda guardar la información del estado en un grupo de pares clave-valor. La implementación por defecto de este método almacena la información sobre el estado de la jerarquía de la vista de la actividad, como puede ser el texto en un widget EditText o la posición del desplazamiento en un ListView.

Para guardar información adicional del estado de tu actividad, debes implementar onSaveInstanceState() y añadir pares clave-valor al objeto Bundle. Por ejemplo:

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

PrecauciónSiempre llama a la implementación de la superclase onSaveInstanceState() para que la implementación por defecto pueda guardar el estado de la jerarquía de la vista.

Restaura el Estado de tu Actividad

Cuando tu actividad se recrea después de que haya sido previamente destruida, puedes recuperar el estado guardado en el Bundle que el sistema transmite a tu actividad. Tanto los métodos onCreate() como onRestoreInstanceState() reciben el mismo Bundle que contiene la información del estado de la instancia.

Ya que el método onCreate() se llama si el sistema está creando una nueva instancia de tu actividad o recreando una anterior, debes comprobar si el Bundle con el estado es inválido o nulo (null) antes de intentar leerlo. Si es inválido o nulo, entonces el sistema crea una nueva instancia de la actividad, en lugar de restaurar la que fue destruida.

Por ejemplo, aquí puedes ver cómo puedes restaurar algunos datos del estado en 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
    }
    ...
}

En lugar de restaurar el estado durante onCreate() puedes elegir implementar onRestoreInstanceState(), el cual es llamado por el sistema después de llamar al método onStart(). El sistema llama a onRestoreInstanceState() solo si hay un estado guardado que restaurar, así que no necesitas comprobar si el Bundle es inválido o nulo:

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

Precaución: Siempre llama a la implementación de la superclase de onRestoreInstanceState(), así la implementación por defecto puede recuperar el estado de la jerarquía de la vista.

Para aprender más sobre recrear tu actividad debido a un evento de reinicio en tiempo de ejecución (por ejemplo cuando la pantalla gira), lee Manipulación de los Cambios en Tiempo de Ejecución.

Puedes ver más información sobre Recrear una Actividad en la página oficial de Google en inglés pulsando aquí.

Los comentarios de Disqus están cargando....