Introducción a las actividades

La clase Activity es un componente fundamental de una app para Android, y la forma en que se inician y se organizan las actividades es una parte fundamental del modelo de aplicación de la plataforma. A diferencia de los paradigmas de programación en los que las apps se inician con un método main(), el sistema Android inicia el código en una instancia de Activity invocando métodos de devolución de llamada específicos que corresponden a etapas específicas de su ciclo de vida.

En este documento, se presenta el concepto de actividades y se proporciona una orientación básica sobre cómo trabajar con ellas. Si deseas obtener información adicional sobre las prácticas recomendadas para diseñar la arquitectura de tu app, consulta la Guía de arquitectura de apps.

El concepto de actividades

La experiencia de la app para dispositivos móviles difiere de la versión para computadoras de escritorio en que la interacción de un usuario con la app no siempre comienza en el mismo lugar. En este caso, no hay un lugar específico desde donde el usuario comienza su actividad. Por ejemplo, si abres una app de correo electrónico desde la pantalla principal, es posible que veas una lista de correos electrónicos. Por el contrario, si usas una app de redes sociales que luego inicia tu app de correo electrónico, puedes ir directamente a la pantalla de la app de correo electrónico para redactar un mensaje.

La clase Activity está diseñada para facilitar este paradigma. Cuando una app invoca a otra, la que realiza la llamada invoca una actividad en la otra, en lugar de a la app como un todo atómico. De esta manera, la actividad sirve como punto de entrada para la interacción de una app con el usuario. Implementas una actividad como una subclase de la clase Activity.

Una actividad proporciona la ventana en la que la app dibuja su IU. Por lo general, esta ventana ocupa toda la pantalla, pero puede ser más pequeña que ella y flotar sobre otras ventanas. Por lo general, una actividad implementa una pantalla en una app. Por ejemplo, una de las actividades de una app puede implementar una pantalla Preferencias, mientras que otra implementa una pantalla Seleccionar foto.

La mayoría de las apps contienen varias pantallas, lo que significa que comprenden varias actividades. Por lo general, una actividad en una app se especifica como la actividad principal, que es la primera pantalla que aparece cuando el usuario inicia la app. Luego, cada actividad puede iniciar otra actividad para realizar diferentes acciones. Por ejemplo, la actividad principal de una app de correo electrónico simple podría proporcionar una pantalla en la que se muestre una bandeja de entrada de correo electrónico. A partir de allí, la actividad principal podría iniciar otras actividades que proporcionan pantallas para tareas como escribir correos electrónicos y abrir correos electrónicos individuales.

Si bien las actividades funcionan en conjunto para formar una experiencia del usuario coherente en una app, cada actividad está vinculada de forma flexible a otras actividades. Por lo general, existen dependencias mínimas entre las actividades de una app. De hecho, estas suelen iniciar actividades que pertenecen a otras apps. Por ejemplo, una app de navegador podría iniciar la función Compartir actividad de una app de redes sociales.

Para usar actividades en tu app, debes registrar información sobre ellas en el manifiesto de la app y administrar los ciclos de vida de las actividades de manera adecuada. En el resto de este documento, se presentan estos temas.

Cómo configurar el manifiesto

Para que tu app pueda usar actividades, debes declararlas, y ciertos de sus atributos, en el manifiesto.

Cómo declarar actividades

Para declarar tu actividad, abre el archivo de manifiesto y agrega un elemento <activity> como elemento secundario de <application>. Por ejemplo:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

El único atributo obligatorio para este elemento es android:name, que especifica el nombre de la clase de la actividad. También puedes agregar atributos que definan características de la actividad, como la etiqueta, el ícono o el tema de la IU. Para obtener más información sobre estos y otros atributos, consulta la documentación de referencia del elemento <activity>.

Nota: Después de publicar tu app, no debes cambiar los nombres de las actividades. Si lo haces, se pueden romper algunas funcionalidades, como los accesos directos a las apps. Para obtener más información sobre los cambios que debes evitar después de la publicación, consulta Elementos que no pueden cambiar.

Cómo declarar filtros de intents

Los filtros de intents son una función muy potente de la plataforma de Android. Proporcionan la capacidad de iniciar una actividad no solo en función de una solicitud explícita, sino también de una implícita. Por ejemplo, una solicitud explícita podría indicarle al sistema que inicie la actividad Enviar correo electrónico en la app de Gmail. En cambio, una solicitud implícita le indica al sistema que inicie una pantalla Enviar correo electrónico en cualquier actividad que pueda realizar la tarea. Cuando la IU del sistema le pregunta al usuario qué app usar para realizar una tarea, ese es un filtro de intents en funcionamiento.

Para aprovechar esta función, declara un atributo <intent-filter> en el elemento <activity>. La definición de este elemento incluye un elemento <action> y, de manera opcional, un elemento <category> o <data>. Estos elementos se combinan para especificar el tipo de intent al que puede responder tu actividad. Por ejemplo, en el siguiente fragmento de código, se muestra cómo configurar una actividad que envía datos de texto y recibe solicitudes de otras actividades para hacerlo:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

En este ejemplo, el elemento <action> especifica que esta actividad envía datos. La declaración del elemento <category> como DEFAULT permite que la actividad reciba solicitudes de inicio. El elemento <data> especifica el tipo de datos que puede enviar esta actividad. En el siguiente fragmento de código, se muestra cómo llamar a la actividad descrita anteriormente:

Kotlin

val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)

Java

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);
Si deseas que tu app sea independiente y que no permita que otras apps activen sus actividades, no necesitas ningún otro filtro de intents. Las actividades que no deseas que estén disponibles para otras aplicaciones no deben tener filtros de intents, y puedes iniciarlas por tu cuenta con intents explícitos. Para obtener más información sobre cómo tus actividades pueden responder a los intents, consulta Intents y filtros de intents.

Cómo declarar permisos

Puedes usar la etiqueta <activity> del manifiesto para controlar qué apps pueden iniciar una actividad en particular. Una actividad superior no puede iniciar una actividad secundaria, a menos que ambas tengan los mismos permisos en su manifiesto. Si declaras un elemento <uses-permission> para una actividad superior, cada actividad secundaria debe tener un elemento <uses-permission> coincidente.

Por ejemplo, si tu app quiere usar una app hipotética llamada SocialApp para compartir una publicación en redes sociales, SocialApp debe definir el permiso que debe tener la app que la llama:

<manifest>
<activity android:name="...."
   android:permission=”com.google.socialapp.permission.SHARE_POST”

/>

Luego, para poder llamar a SocialApp, tu app debe coincidir con el permiso establecido en el manifiesto de SocialApp:

<manifest>
   <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

Para obtener más información sobre los permisos y la seguridad en general, consulta Seguridad y permisos.

Cómo administrar el ciclo de vida de la actividad

A lo largo de su vida útil, una actividad pasa por varios estados. Para administrar las transiciones entre estados, debes usar una serie de devoluciones de llamadas. En las siguientes secciones, se presentan estas devoluciones de llamada.

onCreate()

Debes implementar esta devolución de llamada, que se activa cuando el sistema crea tu actividad. Tu implementación debe inicializar los componentes esenciales de tu actividad. Por ejemplo, tu app debería crear vistas y vincular datos a listas aquí. Lo más importante es que aquí es donde debes llamar a setContentView() para definir el diseño de la interfaz de usuario de la actividad.

Cuando onCreate() finaliza, la siguiente devolución de llamada siempre es onStart().

onStart()

A medida que se cierra onCreate(), la actividad entra en el estado Started y se vuelve visible para el usuario. Esta devolución de llamada contiene los preparativos finales de la actividad para pasar al primer plano y convertirse en interactiva.

onResume()

El sistema invoca esta devolución de llamada justo antes de que la actividad comience a interactuar con el usuario. En este punto, la actividad se encuentra en la parte superior de la pila de actividades y captura todas las entradas del usuario. La mayor parte de la funcionalidad principal de una app se implementa en el método onResume().

La devolución de llamada onPause() siempre sigue a onResume().

onPause()

El sistema llama a onPause() cuando la actividad pierde el foco y pasa al estado En pausa. Este estado se produce, por ejemplo, cuando el usuario presiona el botón Atrás o Recientes. Cuando el sistema llama a onPause() para tu actividad, significa que esta sigue siendo parcialmente visible, pero, a menudo, es una indicación de que el usuario está abandonando la actividad y que esta pronto entrará en el estado Detenida o Reanudada.

Una actividad en estado Detenida puede continuar actualizando la IU si el usuario espera que se actualice. Algunos ejemplos de actividad de este tipo son mostrar la pantalla de un mapa de navegación o la reproducción de un reproductor multimedia. Incluso si esas actividades pierden el enfoque, el usuario espera que su IU continúe actualizándose.

No debes usar onPause() para guardar datos de la aplicación o del usuario, realizar llamadas de red o ejecutar transacciones de bases de datos. Para obtener más información sobre cómo guardar datos, consulta Cómo guardar y restablecer el estado de la actividad.

Una vez que onPause() termine de ejecutarse, la siguiente devolución de llamada será onStop() o onResume(), según lo que ocurra después de que la actividad entre en el estado Pausado.

onStop()

El sistema llama a onStop() cuando la actividad ya no es visible para el usuario. Esto puede suceder porque se está destruyendo la actividad, se inicia una nueva actividad o una actividad existente pasa al estado Reanudada y está cubriendo la actividad detenida. En todos estos casos, la actividad detenida ya no está visible.

La siguiente devolución de llamada a la que llama el sistema es onRestart(), si la actividad vuelve a interactuar con el usuario, o mediante onDestroy() si esta actividad está finalizando por completo.

onRestart()

El sistema invoca esta devolución de llamada cuando una actividad en estado Detenida está por reiniciarse. onRestart() restablece el estado de la actividad desde el momento en que se detuvo.

A esta devolución de llamada siempre le sigue onStart().

onDestroy()

El sistema invoca esta devolución de llamada antes de que se destruya una actividad.

Esta devolución de llamada es la última que recibe la actividad. Por lo general, onDestroy() se implementa para garantizar que se liberen todos los recursos de una actividad cuando esta o el proceso que la contiene se destruye.

En esta sección, solo se proporciona una introducción a este tema. Para obtener un tratamiento más detallado del ciclo de vida de la actividad y sus devoluciones de llamada, consulta El ciclo de vida de la actividad.