X

Parar y Reiniciar una Actividad

Es importante parar y reiniciar una actividad (stopping and restarting) durante el ciclo de vida de la actividad para asegurar que tus usuarios perciban que la app está siempre viva y no pierde sus progresos. Hay unos cuantos escenarios en los cuales tu actividad se para y se reinicia:

  • El usuario abre la pantalla de Apps Recientes y cambia desde tu app a otra app. La actividad en tu app que estaba en primer plano se para. Si el usuario regresa a tu app desde la Pantalla de Inicio presionando sobre el icono en el launcher o desde la pantalla de Apps Recientes, la actividad se reinicia.
  • El usuario realiza una acción en tu app que inicia una nueva actividad. La actividad actual se para cuando la segunda actividad se crea. Si el usuario presiona el botón atrás en la segunda actividad, la primera actividad se reinicia.
  • El usuario recibe una llamada de teléfono mientras utilizaba tu app en su teléfono.

La clase Activity proporciona dos métodos del ciclo de vida, onStop()onRestart(), el cual te permite específicamente manipular como tu actividad se para y se reinicia. A diferencia del estado pausada, el cual identifica una obstrucción parcial de la UI, el estado parada garantiza que la UI no se encuentra visible y la atención del usuario está en una actividad diferente (o incluso en otra se ha desplazado a otra app).

Nota: Ya que el sistema retiene tu instancia de Activity en la memoria del sistema cuando se para, es posible que no necesites implementar el método onStop()onRestart() (o incluso onStart()). Para la mayoría de las actividades que son relativamente simples, la actividad se parará y se reiniciará perfectamente por si solas así que es probable que únicamente necesites implementar el método onPause() para pausar las acciones en marcha y desconectar la actividad de los recursos del sistema.

Figura 1. Cuando el usuario abandona tu actividad, el sistema llama a onStop() para parar la actividad (1). Si el usuario regresa a la actividad mientras está parada, el sistema llama a onRestart() (2), rápidamente es seguido por onStart() (3) y onResume(4). Presta atención a que no importa qué escenario provoca que la actividad se pare, el sistema siempre llama a onPause() antes de llamar a onStop().

Parar tu Actividad

Cuanto tu actividad recibe la llamada del método onStop(), no se encuentra visible y debería liberarse la mayoría de los recursos que no se necesitan mientras el usuario no la está usando. Una vez que tu actividad está parada, el sistema debe destruir la instancia si fuese necesario recuperar memoria del sistema- En casos extremos, el sistema puede simplemente matar tu app incluso sin llamar al proceso final del ciclo de vida, onDestroy(), así que es importante que utilices onStop() para liberar los recursos que pueden provocar perdidas de memoria.

Aunque el método onPause() es llamado antes que onStop(), puedes utilizar onStop() para realizar operaciones en las que suprimir las tareas que tardarán más en detenerse y que utilizaban un mayor rendimiento del CPU, como escribir información en una base de datos.

Por ejemplo, aquí tienes una implementación de onStop() que guarda el contenido de un borrador en un almacenamiento persistente:

@Override
protected void onStop() {
    super.onStop();  // Always call the superclass method first

    // Guardar el borrador actual ya que la actividad se está parando y 
    // nosotros queremos asegurarnos de que el progreso de la nota no se pierda.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}

Cuando tu actividad se para, el objeto Activity se mantiene en la memoria y se vuelve a llamar cuando la actividad se reanuda.. No necesitas reiniciar todos los componentes que fueron creados durante cualquiera de los métodos hasta alcanzar el estado Resumed. El sistema también permite rastrear el estado actual para cada vista (View) en en layout, así si el usuario introduce un texto en un widget EditText, el contenido se almacena y no necesitas guardarlo y restaurarlo.

Nota: Incluso si el sistema destruye tu actividad mientras se está parando, se mantiene el estado de los objetos View (como el texto en un EditText) en un Bundle (un conjunto de pares clave-valor) y restaurarlos si el usuario navega atrás para volver a entrar en la misma instancia de la actividad (en la siguiente lección se verás más información sobre como utilizar un Bundle para guardar otros datos de estado en caso de que tu actividad se destruya y se recree).

Iniciar/Reiniciar tu Actividad

Cuando tu actividad vuelve a estar en primer plano desde el estado parada (stopped), recibe una llamada a onRestart(). El sistema también llama al método onStart(), que ocurre cada vez que tu app se vuelve visible (tanto siendo reiniciada como creada por primera vez). El método onRestart(), sin embargo, se llama únicamente cuando la actividad se reanuda desde el estado parada, así que puedes utilizarlo para realizar trabajos de restauración especiales que puedan ser necesarios sollo si la actividad fue parada previamente, pero no destruida (destroyed).

Es poco común que una app necesite utilizar onRestart() para restaurar el estado de la actividad, así que no hay guías para este método que se apliquen en la mayoría de las apps. Sin embargo, ya que tu método onStop() debería esencialmente limpiar los recursos de todas tus actividades, necesitarás volver a instanciarlas cuando la actividad se reinicia. Aún así, también necesitas instanciarlas cuando tu actividad se crea por primera vez (cuando no hay una instancia existente de la actividad). Por esta razón, deberías utilizar habitualmente el método onStart() como contrapartida de onStop() ya que el sistema llama a onStart() tanto cuando se crea tu actividad como cuando se reinicia la actividad desde el estado parada.

Por ejemplo, cómo el usuario puede haber estado fuera de tu app durante un largo periodo de tiempo antes de volver a ella, el método onStart() es un buen lugar para verificar que las características del sistema necesarias están habilitadas:

@Override
protected void onStart() {
    super.onStart();  // Always call the superclass method first

    // La actividad está siendo reiniciada o iniciada por primera vez así
    // que este es el lugar donde asegurarnos de que el GPS está habilitado
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

    if (!gpsEnabled) {
        // Create a dialog here that requests the user to enable GPS, and use an intent
        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
        // to take the user to the Settings screen to enable GPS when they click "OK"
    }
}

@Override
protected void onRestart() {
    super.onRestart();  // Always call the superclass method first

    // Activity being restarted from stopped state    
}

Cuando el sistema destruye tu actividad, llama al método onDestroy() de tu Activity. Ya que generalmente habrás liberado la mayoría de los recursos en onStop(), recibir la llamada onDestroy() no es algo que la mayoría de las apps necesiten utilizar. Este método es tu última oportunidad para limpiar los recursos que podrían provocar perdidas de memoria, así que deberías asegurarte de que los hilos adicionales se destruyen y otras acciones de ejecución de larga duración como los métodos de seguimiento (tracing) se paran también.

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

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