X

Iniciar una Actividad

A diferencia de otros paradigmas de programación en los cuales las apps se ejecutan con el método main(), el sistema Android inicia el código en una instancia Activity llamando a ciertos métodos específicos que corresponden a las diferentes etapas de su ciclo de vida. Hay una secuencia de métodos que inician una actividad, y otra secuencia de métodos que la finalizan.

Esta lección proporciona un resumen de los métodos más importantes del ciclo de vida de una actividad y te muestra cómo manipular la primera llamada al ciclo de vida la cual crea una nueva instancia de tu actividad.

Durante la vida de una actividad, el sistema llama a un conjunto clave de métodos del ciclo de vida en una secuencia similar a una pirámide escalonada. Cada etapa del ciclo de vida de la actividad es un escalón de dicha pirámide. Conforme el sistema crea una nueva instancia de una actividad, cada método mueve el estado de la actividad un escalón más allá hacia arriba. El escalón superior de la pirámide es el punto en el cual la actividad se está ejecutando en primer plano y en el cual el usuario puede interactuar con ella.

Cuando el usuario deje la actividad, el sistema llama a otros métodos que mueven el estado de la actividad hacia abajo en la pirámide, con el fin de desmantelar la actividad. En algunos casos, la actividad se moverá únicamente una parte hacia abajo en la pirámide y esperará a que ocurra algo (el usuario cambie de app, etc), desde dicho punto la actividad puede también volver a subir escalones (el usuario regresa a la actividad) y reanudar la parte donde se quedó el usuario.

Figura 1. Una ilustración simplificada del ciclo de vida de una Actividad, expresada mediante una pirámide escalonada. Te muestra cómo, para cada llamada utilizada para ir un escalón más allá en la actividad hacia el estado Reanudada (Resumed) en la parte superior, hay un método que finaliza la actividad. La actividad también puede regresar al estado reanudada desde el estado Pausada (Paused) y Parada (Stopped).

Dependiendo de la complejidad de tu actividad, probablemente no necesites implementar todos los métodos del ciclo de vida. Sin embargo, es importante que comprendas cada uno de ellos e implementes los que asegurarán que tu app tenga el comportamiento que el usuario espera de la misma. Implementarlos asegura que tu app se comporte correctamente de diversas formas, incluyéndose:

  • Deje de funcionar si el usuario recibe una llamada o cambia a otra app mientras estaba utilizando la tuya.
  • No gaste recursos del sistema cuando el usuario no la esté usando activamente.
  • No perder el progreso del usuario si ellos dejan tu app y regresan más tarde.
  • No responda o e pierda el progreso del usuario cuando la pantalla gira su orientación desde modo horizontal a vertical y viceversa.

En la siguiente lección aprenderás que hay varias situaciones en las cuales una actividad pasa entre diferentes estados como puedes ver en la figura 1. Sin embargo, solo tres de esos estados pueden ser estáticos. Es decir, la actividad puede existir únicamente en uno de esos tres estados durante un periodo extenso de tiempo:

Iniciada (Resumed)

  • En este estado, la actividad se encuentra en primer plano y el usuario puede interactuar con ella. (También algunas veces se refieren a este estado como en “ejecución”).

Pausada (Paused)

  • En este estado, la actividad se encuentra parcialmente superpuesta por otra actividad. la otra actividad que está en primer plano es semitransparente o no cubre toda la pantalla al completo. La actividad pausada no recibe ninguna entrada del usuario y no puede ejecutar ningún código.

Parada (Stopped)

  • En este estado, la actividad está completamente oculta y no es visible para el usuario; se considera que está en segundo plano. Mientras está parada, la instancia de la actividad y toda la información de su estado como puede ser las variables se encuentran almacenadas, pero no puede ejecutar ningún código.

Los otros estados, Creada (Created) e Iniciada (Started) son transitorios y el sistema se mueve rápidamente entre ellos hacia el siguiente estado mediante la llamada del método correspondiente del ciclo de vida. Es decir, el sistema llama a onCreate(), rápidamente llamará a onStart(), el cual será rápidamente seguido por onResume().

Ese es el ciclo de vida básico de una actividad. Ahora puedes empezar a aprender algunos comportamientos específicos del ciclo de vida.

Especificar la Actividad Principal de tu App

Cuando el usuario selecciona el icono de tu app para la Pantalla de Inicio, el sistema llama al método onCreate() de la Activity en tu app que tu declaraste como la actividad principal. Esta actividad funciona como el punto de entrada a la interfaz de usuario de tu app.

Puedes definir cual es la actividad que será la principal en el archivo manifest Android, AndroidManifest.xml, el cual se encuentra en la raíz del directorio de tu proyecto.

La actividad principal de tu app debe declararse en el manifest con <intent-filter> que incluye la acción MAIN y la categoría LAUNCHER. Por ejemplo:

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Nota: Cuando crees un nuevo proyecto Android con las herramientas del SDK Android, el proyecto por defecto incluye una clase Activity que se declara en el archivo manifest con este filtro.

Si tanto la acción MAIN como la categoría LAUNCHER no son declaradas para una de tus actividades, el icono de tu app no aparecerá en la lista de apps de la Pantalla de Inicio del dispositivo.

Crear una Nueva Instancia

La mayoría de las apps incluyen diferentes actividades que permiten al usuario realizar distintas acciones. Si una actividad es la actividad principal, significa que se creará cuando el usuario presione sobre el icono de tu app en o si una actividad diferente que tu app inicia en respuesta a una acción del usuario, el sistema crea una nueva instancia de la Activity llamando al método onCreate().

Debes implementar el método onCreate() para que se ejecute la parte lógica de la aplicación lo cual ocurre una única vez durante la vida de la actividad. Por ejemplo, tu implementación de onCreate() debería definir la interfaz de usuario y probablemente instancias de algunas variables.

Por ejemplo, el siguiente ejemplo del método onCreate() muestra cierto código para realizar la configuración fundamentar de la actividad, es decir, declarar la interfaz de usuario (definida en un archivo de layout XML), definir algunas variables y configurar partes de la UI.

TextView mTextView; // Variable para un TextView en el layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Seleccionar el layout de la interfaz de usuario
    // El archivo layout es el siguiente: res/layout/main_activity.xml
    setContentView(R.layout.main_activity);

    // Iniciar el TextView para manipularlo más tarde
    mTextView = (TextView) findViewById(R.id.text_message);

    // Asegurarnos de que estamos utilizando una versión superior a Honeycomb para usar las ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

Precaución: Utilizar el SDK_INT para prevenir que el código se ejecute en sistemas más antiguos funciona únicamente en Android 2.0 (API nivel 5) o superiores. Para versiones más antiguas encontrarás excepciones en tiempo de ejecución.

Una vez que se haya finalizado la ejecución de onCreate(), el sistema llama a onStart()onResume() en serie, rápidamente. Tu actividad nunca permanece en los estados Created o Started. Técnicamente, la actividad se vuelve visible al usuario cuando se llama el método onStart(), pero rápidamente se llama al método onResume() y la actividad permanece en el estado Resumed hasta que algo ocurre para que cambie, como que el teléfono reciba una llamada, el usuario navegue hacia otra actividad o la pantalla del dispositivo se apague.

En la próxima lección verás cómo los otros métodos, onStart()onResume(), son útiles durante el ciclo de vida de la actividad cuando se utilizan para reanudar la actividad desde los estados Paused y Stopped.

Nota: El método onCreate() incluye un parámetro llamado savedInstanceState para el cual obtendrás más información el la siguiente lección, llamada Recrear una Actividad.

Figura 2. Otra ilustración de la estructura del ciclo de vida de una actividad con un énfasis en los tres métodos principales que el sistema llama en serie cuando se crea una nueva instancia de la actividad: onCreate(), onStart(), y onResume(). Una vez esta secuencia se completa, la actividad alcanza el estado Resumed en el cual el usuario puede interactuar con la actividad hasta que cambian a otra actividad diferente.

Destruir la Actividad

Mientras que el primer método del ciclo de vida de la actividad es el onCreate(), el último es onDestroy(). El sistema llama a este método en tu actividad como señal final de que la instancia de tu actividad se está completando y será eliminada de la memoria del sistema.

La mayoría de las apps no necesitan implementar este método ya que las referencias de la clase se destruyen con la actividad y tu actividad debería estar optimizada para realizar las acciones que sean  necesarias durante onPause()onStop(). Sin embargo, si la actividad incluye hilos en segundo plano que has creado durante onCreate(), u otros recursos de ejecución de larga duración que podrían potencialmente producir perdidas de memoria si no son correctamente cerrados, deberías suprimirlos durante el método onDestroy().

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

Nota: El sistema llama a onDestroy() después de haber llamado a los métodos onPause()onStop() en todas las situaciones, excepto en una: cuando llamas al método finish() dentro de onCreate(). En algunos casos como cuando tu app opera como una decisión temporal para lanzar otra actividad, puedes llamar a finish() dentro de onCreate() para destruir la actividad. En este caso, el sistema llama inmediatamente a onDestroy() sin llamar a los otros métodos mencionados anteriormente del ciclo de vida.

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

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