Estructura de aplicaciones Android: actividades y fragmentos

Advertisement

Las aplicaciones de Android tienen una estructura distintiva en comparación con otras plataformas como iOS, Windows o macOS. Tanto si estás empezando en el desarrollo de aplicaciones para Android como si quieres profundizar tus conocimientos, es importante entender los componentes clave que componen las aplicaciones de Android.

Advertisement

En este artículo, Bardimin discutirá en detalle Activity, Fragment, Intent, Broadcast Receiver y Service, que son los componentes principales para garantizar que las aplicaciones de Android funcionen correctamente.

Al comprender cómo funciona e interactúa cada uno de estos componentes, puede crear una aplicación que no solo sea eficiente, sino también fácil de administrar y desarrollar más. Tanto si eres un principiante como un desarrollador experimentado, esta guía te ayudará a entender la estructura de las aplicaciones de Android e implementarlas en tus proyectos.

Advertisement

Comencemos explorando Activity, los componentes básicos responsables de mostrar la interfaz de usuario (UI) dentro de las aplicaciones de Android.

Android Application Structure

1. Activity: Interfaz de usuario básica

Activity es uno de los elementos más importantes en el desarrollo de aplicaciones para Android. Este elemento se encarga de mostrar el (UI) user interface y regular la interacción del usuario con la aplicación. Cada Activity suele representar una sola vista dentro de la aplicación, y las aplicaciones de Android suelen constar de varias Activity que colaboran entre sí para proporcionar una experiencia de usuario completa.

Advertisement

Por ejemplo, en una aplicación de calendario:

  • Activity Primero: Muestra una lista de los horarios diarios de los usuarios.
  • Activity Segundo: Permite a los usuarios agregar nuevas citas completando formularios.

Setiap Activity está diseñado para realizar tareas específicas y se puede acceder a él por separado, tanto desde la propia aplicación como desde otras aplicaciones. Esto hace que Activity sea un componente altamente flexible y reutilizable.

Principales características de la actividad

  • Independiente: Cada Activity opera de manera independiente y es independiente de otras Activity.
  • Puede ser llamado por Intent: se puede acceder a Activity mediante Intent, ya sea explícitamente (mencionando directamente el nombre de la clase) o implícitamente (especificando la acción que desea realizar).
  •  (Lifecycle) Ciclo de vida: Activity tiene ciclos de vida administrados por sistemas Android, como onCreate(), onStart(), onResume() y onDestroy(), que permiten a los desarrolladores controlar el comportamiento de la app cuando se crea, muestra o detiene Activity.

Cómo funciona la actividad

Activity funciona de forma autónoma, lo que significa que cada Activity puede funcionar sin depender de otras Activity. Esto permite que Activity se reutilice en una variedad de aplicaciones.

Ejemplos de reutilización de actividades

  • Aplicaciones de correo electrónico: Una aplicación de correo electrónico puede tener una Activity para enviar mensajes. Activity puede ser utilizada por otras aplicaciones, como la aplicación Calendario, para enviar invitaciones a reuniones sin necesidad de crear una nueva Activity desde cero.
  • Aplicaciones de redes sociales: Activity para compartir contenido se pueden reutilizar en varias aplicaciones, como galerías de fotos o aplicaciones de noticias.

La capacidad de reutilizar este Activity no solo ahorra tiempo en el desarrollo, sino que también mantiene la coherencia de la interfaz de usuario en varias aplicaciones.

Comunicación entre actividades

Activity no pueden interactuar en persona. Alternativamente, Android proporciona un mecanismo llamado Intent para iniciar otro Activity y transferir datos entre Activity.

Cómo funciona la intención

Puede usar Intent para abrir una nueva Activity desde una Activity activa. Por ejemplo, cuando un usuario presiona el botón “Agregar cita” en la aplicación de calendario, Intent abrirá una nueva Activity para completar el formulario de cita.

Intent también pueden transportar información de un Activity a otro Activity. Por ejemplo, puede enviar detalles de citas de la lista de citas Activity a los detalles de citas Activity.

Ejemplos de uso de intenciones

  • Aplicaciones de comercio electrónico: cuando los usuarios seleccionan productos de la lista, Intent se utiliza para abrir los detalles del producto Activity y enviar información como nombres de productos, precios e imágenes.
  • Aplicación de chat: Intent utiliza para abrir Activity de chat y enviar datos como ID de usuario y nombres de contacto.

2. Fragment: Modularidad en la interfaz de usuario

Fragment es un elemento importante en el desarrollo de aplicaciones de Android que permite dividir Activity en partes pequeñas y modulares. Cada Fragment tiene su propia  interfaz de usuario y lógica (UI), lo que facilita la gestión de una interfaz más flexible y dinámica.

Al aprovechar Fragment, puede crear aplicaciones que respondan mejor a diferentes tamaños de pantalla y orientaciones de dispositivos, como teléfonos, tabletas o dispositivos plegables.

Beneficios de usar Fragment

Fragment proporciona algunos beneficios clave en el desarrollo de aplicaciones para Android:

  1. Modularidad: Al dividir Activity en Fragment, puede administrar cada parte de la interfaz por separado, lo que facilita el desarrollo y mantenimiento del código.
  2. Flexibilidad: Fragment permite la aparición de varias partes de la interfaz en un solo Activity, especialmente útil para dispositivos con pantallas grandes como tablets.
  3. Reutilización: Fragment se puede reutilizar en una variedad de Activity, lo que reduce la repetición de código y mejora la eficiencia del desarrollo.
  4. Adaptabilidad: Fragment fácil personalización de la interfaz para diferentes tamaños de pantalla y orientaciones de dispositivos.

Ejemplos de uso de fragmentos en aplicaciones de comercio electrónico:

  • Fragment Primero: Muestra la lista de productos en el lado izquierdo de la pantalla.
  • Fragment Segundo: Muestra los detalles del producto en el lado derecho de la pantalla.
  • En dispositivos móviles, solo se muestra un fragmento a la vez, mientras que en tabletas, ambos Fragment se pueden mostrar al mismo tiempo.

Cómo  funciona Fragment

Fragment tienen un ciclo de vida similar al Activity, incluidos métodos como onCreateView(), onStart() y onDestroyView(). Sin embargo, el ciclo de vida Fragment está relacionado con el Activity que lo muestra.

Puede agregar Fragment a Activity mediante FragmentManager y FragmentTransaction.

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_CONTAINER, new MyFragment());
fragmentTransaction.commit();

Fragment no pueden comunicarse entre sí directamente. Alternativamente, la comunicación se lleva a cabo a través del Activity que alberga el Fragment o mediante el uso de una interfaz (interface) para transferir datos.

3. Intent: Mecanismo de comunicación entre componentes

Intent es uno de los mecanismos clave en el desarrollo de aplicaciones Android. Este componente se utiliza para iniciar una Activity, Service o enviar Broadcast. Además, Intent también permite la comunicación entre componentes dentro de la misma aplicación o incluso entre diferentes aplicaciones.

Intent pueden diferenciarse en:

  • Explícito: llama a un componente específico (como Activity o Service) mencionando directamente su nombre de clase.
  • Implícito: Especifica la acción que quieres realizar o el tipo de datos que quieres procesar, y el sistema Android seleccionará el componente más adecuado.

Tipos de intención

1. Explicit Intent

Explicit Intent se utiliza cuando se sabe claramente a qué componente se desea llamar, como un Activity o Service específico de la aplicación.

Cómo funciona:

Especifique el nombre de la clase de componente a la que desea acceder. Por ejemplo, iniciar una nueva Activity para mostrar los detalles del producto.

Intent intent   new Intent(this, ProductDetailActivity.class);
startActivity(intent);

Ejemplo de uso:

  • Inicie una nueva Activity para ver el formulario de inicio de sesión.
  • Inicie Service para descargar archivos en segundo plano.

2. Intent Implicit

Intent Implicit se utiliza cuando desea pedirle al sistema Android que seleccione el componente más apropiado en función de las acciones o los tipos de datos que especifique.

Cómo funciona:

Especifique las acciones (como ACTION_VIEW) y los datos (como URI o tipos MIME) que desea procesar. El sistema Android buscará un componente que pueda manejar la solicitud.

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(“https://www.example.com”));
startActivity(intent);

Ejemplo de uso:

  • Abra la URL en el navegador predeterminado del usuario.
  • Comparte texto o imágenes con otras aplicaciones (como redes sociales o correo electrónico).
  • Seleccione la aplicación para abrir el archivo PDF.

La diferencia entre intención explícita e implícita

AspectosExplicit IntentImplicit Intent
PropósitoLlama a componentes específicos de la aplicación.Solicitar al sistema que seleccione el componente adecuado.
UsoSe utiliza para la navegación interna de la aplicación.Se utiliza para interactuar con otras aplicaciones o componentes del sistema.
EjemploInicie la actividad de detalles del producto.Abra la URL en un navegador o comparta contenido.

Ejemplos de uso de intents en aplicaciones

1. Aplicaciones de comercio electrónico:

  • Explicit Intent: Comienza Activity detalles del producto cuando el usuario hace clic en un elemento de la lista de productos.
  • Implicit Intent: Comparta los detalles del producto en aplicaciones de redes sociales o correos electrónicos.

2. Aplicaciones de redes sociales:

  • Explicit Intent: Inicia un comentario Activity cuando el usuario hace clic en el botón “Ver comentarios”.
  • Implicit Intent: Abre un enlace externo en el navegador predeterminado del usuario.

3. Aplicaciones de música:

  • Explicit Intent: Inicia Service para reproducir una canción en segundo plano.
  • Implicit Intent: Comparte canciones con otras aplicaciones como WhatsApp o Instagram.

4. Broadcast Receiver: Responder a los cambios del sistema

Broadcast Receiver es un componente esencial de una aplicación de Android que permite que tu aplicación responda a Broadcast Intent enviados por el sistema Android u otras aplicaciones. Broadcast Intent es un mensaje del sistema que te informa sobre un cambio de estado o un evento específico, como un cambio en el estado de la batería, la conectividad de red o un mensaje SMS entrante.

Mediante el uso de Broadcast Receiver, puede crear aplicaciones que respondan mejor a los cambios en el entorno o el sistema, proporcionando así una mejor experiencia de usuario.

Cómo funciona Broadcast Receiver

Broadcast Receiver se ejecuta en segundo plano y no tiene interfaz de usuario. Están diseñados para responder a Broadcast Intent de manera rápida y eficiente. Estos son algunos puntos clave sobre cómo funciona Broadcast Receiver:

1. Registro:

  • Broadcast Receiver debe estar registrado en el sistema Android para responder a Broadcast Intent.
  • El registro se puede realizar de forma estática (a través de AndroidManifest.xml) o dinámica (mediante código de programa).

Ejemplo de registro estático en AndroidManifest.xml:

  <receiver android:name=“.MyBroadcastReceiver”>
  <intent-filter>
  <action android:name=“android.intent.action.BATTERY_LOW” />
  </intent-filter>
   </receiver>

Ejemplo de inscripción dinámica en código:

  IntentFilter filter  new IntentFilter(Intent.ACTION_BATTERY_LOW);
 MyBroadcastReceiver receiver  new MyBroadcastReceiver();
   registerReceiver(receiver,  filter);

2. Tiempo de ejecución limitado:

  • Broadcast Receiver solo tuvo unos 5 segundos para completar la tarea.
  • Si una tarea tarda más tiempo, como descargar datos o procesar archivos, le recomendamos que inicie Service o utilice WorkManager.

3. Tareas factibles:

  • Enviar notificaciones: notifique a los usuarios sobre cambios de estado, como batería baja o conexiones a Internet.
  • Iniciar servicio: inicie  el servicio para realizar tareas en segundo plano, como la sincronización de datos.
  • Actualizar datos: actualice los datos locales o envíe datos a un servidor.

Tipos de intención de transmisión

Broadcast Intent se pueden dividir en dos tipos:

1. Normal Broadcast:

  • Se envía de forma asíncrona a todos los Broadcast Receiver registrados.
  • Ejemplo: ACTION_BOOT_COMPLETED (se envía cuando el dispositivo termina de arrancar).

2. Ordered Broadcast:

  • Se envía secuencialmente a un Broadcast Receiver a la vez.
  • Broadcast Receiver puede modificar los resultados o detener la propagación de Broadcast Intent.
  • Ejemplo: ACTION_NEW_OUTGOING_CALL (se envía cuando un usuario realiza una llamada saliente).

Ejemplos de uso de receptores de radiodifusión

1. Respuesta a los cambios de batería:

  • Broadcast Receiver puede detectar cuando la batería del dispositivo está baja (ACTION_BATTERY_LOW) o se está cargando (ACTION_BATTERY_OKAY).
  • Ejemplo: Enviar una notificación al usuario cuando la batería está baja.

2. Responder a los cambios en la conectividad de red:

  • Broadcast Receiver puede detectar cambios en la conexión a Internet (ACTION_CONNECTIVITY_CHANGE).
  • Ejemplo: Muestra un mensaje cuando un dispositivo pierde la conexión a Internet.

3. Responder a los mensajes SMS entrantes:

  • Broadcast Receiver puede detectar mensajes SMS entrantes (ACTION_SMS_RECEIVED).
  • Ejemplo: Mostrar notificaciones o procesar mensajes SMS automáticamente.

5. Service: Proceso en segundo plano sin interfaz de usuario

Service es un componente esencial en una aplicación de Android que le permite ejecutar tareas en segundo plano sin una interfaz de usuario. Service es ideal para tareas que deben seguir ejecutándose incluso cuando la aplicación está inactiva, como la transmisión de música, la sincronización de datos o las actualizaciones de ubicación.

Mediante el uso de Service, puede asegurarse de que su aplicación siga funcionando correctamente incluso cuando los usuarios no interactúen directamente con la aplicación.

Tipos de servicio

Service se pueden dividir en dos tipos principales:

1. Started Service

Started Service es un tipo de Service que se inicia mediante otro componente, como Activity o Broadcast Receiver, y continuará ejecutándose hasta que se complete la tarea.

Cómo funciona:

  • Started Service comienza llamando al método startService().
  • Service ejecutará en segundo plano hasta que la tarea se complete o se detenga manualmente.
  • Una vez completada la tarea, el Service se detendrá automáticamente.

Código de ejemplo:

Intent intent = new Intent(this,  MyStartedService.class);
startService(intent);

2. Bound Service

Bound Service es un tipo de Service que se enlaza a otros componentes, como Activity o Fragment, y se ejecutará mientras esos componentes estén activos.

Cómo funciona:

  • Bound Service comienza llamando al método bindService().
  • Service ejecutará mientras haya componentes adjuntos a él.
  • Si todos los componentes liberan la unión, el Service se detendrá automáticamente.

Código de ejemplo:

Intent intent = new Intent(this,  MyBoundService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

La diferencia entre el servicio iniciado y el servicio enlazado

AspectosStarted ServiceBound Service
Cómo empezarEmpezando por startService().Empezando por bindService().
DuraciónSe ejecuta hasta que se completa o se detiene la tarea.Se ejecuta siempre que haya componentes conectados.
ComunicaciónNo se puede comunicar directamente con otros componentes.Puede comunicarse directamente con los componentes unidos.
Ejemplos de usoTransmisión de música, sincronización de datos.Reproductor de música, comunicación en tiempo real.

Ejemplos de uso de servicios en aplicaciones

1. Aplicaciones de música:

  • Started Service: Reproduce música en segundo plano cuando la aplicación está inactiva.
  • Bound Service: Controla la reproducción de música desde Activity o Fragment.

2. Aplicaciones deportivas:

  • Started Service: Rastrea la ubicación del usuario mientras corre o anda en bicicleta.
  • Bound Service: Muestra la ubicación en tiempo real y los datos de velocidad en el Activity.

3. Aplicación de chat:

  • Started Service: Envía y recibe mensajes en segundo plano.
  • Bound Service: Muestra nuevos mensajes en tiempo real en Activity.

6. Content Provider: Intercambio de datos entre aplicaciones

Content Provider es un componente esencial en las aplicaciones de Android que permite que las aplicaciones compartan datos con otras aplicaciones. Mediante el uso de Content Provider, puede dar acceso a los datos de su aplicación, como listas de contactos, archivos multimedia o bases de datos, a otras aplicaciones.

Content Provider también permite que su aplicación acceda a datos de otras aplicaciones, como acceder a la lista de contactos o la galería de fotos de un usuario.

Cómo usar Content Provider

Content Provider proporciona una interfaz estandarizada para acceder y manipular datos. Se accede a los datos a través de URI (Uniform Resource Identifier) definido por el Content Provider.

1. Acceso a los datos desde Content Provider

Para acceder a los datos desde el Content Provider, debe utilizar el ContentResolver y el URI adecuados.

Ejemplo de acceso a una lista de contactos:

Uri uri = ContactsContract.Contacts.CONTENT_URI;
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor != null) {
  while   (cursor.moveToNext()) {
  String name  cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
  Log.d(“Contact”, name);
  }
  cursor.close();
}

2. Agregar, modificar o eliminar datos

También puede agregar, cambiar o eliminar datos a través de Content Provider utilizando ContentResolver.

Adición de datos:

ContentValues values =  new ContentValues();
values.put(ContactsContract.Contacts.DISPLAY_NAME, “John Doe”);
Uri newContactUri = getContentResolver().insert(ContactsContract.Contacts.CONTENT_URI, values);

Modificación de datos:

ContentValues values =  new ContentValues();
values.put(ContactsContract.Contacts.DISPLAY_NAME, “Jane Doe”);
getContentResolver().update(ContactsContract.Contacts.CONTENT_URI, values, null, null);

Eliminación de datos:

getContentResolver().delete(ContactsContract.Contacts.CONTENT_URI, null, null);

Ejemplos de  uso de Content Provider

1. Aplicación de contacto:

  • Content Provider permite que otras aplicaciones accedan a la lista de contactos del usuario.
  • Ejemplo: Una aplicación de mensajería utiliza un Content Provider para seleccionar el contacto del destinatario.

2. Aplicación de galería de fotos:

  • Content Provider permite que otras aplicaciones accedan a las fotos y videos almacenados en el dispositivo.
  • Ejemplo: Una aplicación de redes sociales utiliza un Content Provider para seleccionar las fotos que se van a subir.

3. Aplicación de calendario:

  • Content Provider permite que otras aplicaciones accedan a horarios y eventos en el calendario del usuario.
  • Ejemplo: Una aplicación de recordatorio utiliza un Content Provider para agregar eventos al calendario.

7. Application Manifest: pegamento que mantiene unidas las aplicaciones

Application Manifest es un archivo XML que sirve como un “pegamento” que mantiene unidos todos los componentes de una aplicación de Android. Este archivo define la estructura de la aplicación, incluidos Activity, Service, Broadcast Receiver y Content Provider, así como los permisos necesarios para la aplicación.

El importante papel de Application Manifest

1. Definición de los componentes de la aplicación:

  • Activity: Define la pantalla o la interfaz de usuario.
  • Service: Defina el proceso en segundo plano.
  • Broadcast Receiver: Define los componentes que responden a los mensajes del sistema.
  • Content Provider: Definir el mecanismo de intercambio de datos.

Ejemplo de Activity definición  en AndroidManifest.xml:

<activity android:name=“.MainActivity”>
  <intent-filter>
  <action android:name=“android.intent.action.MAIN” />
  <category android:name=“android.intent.category.LAUNCHER” />
  </intent-filter>
</activity>

2. Declarar permiso:

  • Las aplicaciones de Android requieren permiso para acceder a ciertas funciones, como la cámara, la ubicación o Internet.
  • Este permiso fue declarado en AndroidManifest.xml.

Ejemplo de una declaración de permiso:

<uses-permission android:name=“android.permission.CAMERA” />
<uses-permission android:name=“android.permission.INTERNET” />

3. Definición de los metadatos de la aplicación:

  • Application Manifest también contiene información como el nombre de la aplicación, el icono, el tema y la versión.

Ejemplo de metadatos de la aplicación:

<application
   android:name=“.MyApplication”
   android:icon=“mipmap/ic_launcher”
  android:label=“string/app_name”
   android:theme=“style/AppTheme”>
</application>

8. Application Resources: Activos para la interfaz de usuario

La aplicación para Android almacena recursos como cadenas, imágenes, fuentes y diseños de interfaz de usuario en el directorio /res. Estos recursos se administran por separado del código del programa, lo que le permite personalizar fácilmente la aplicación para diferentes dispositivos, idiomas y orientaciones de pantalla.

Tipos de recursos

1. String: Texto utilizado en la aplicación, como títulos, mensajes o etiquetas.

Almacenado en res/values/strings.xml.

Ejemplo:

<string name=“app_name”>My App</string>
<string name=“welcome_message”>Welcome to My App!</string>

2. Imágenes: Recursos visuales como iconos, imágenes de fondo o ilustraciones.

Almacenado en res/drawable/res/mipmap/.

Ejemplos: ic_launcher.png, background.jpg.

3. (Layout) Layout: Un archivo XML que define la estructura de la interfaz de usuario.

Almacenado en res/layout/.

Ejemplos: activity_main.xml, fragment_detail.xml.

4. Color: La definición del color utilizado en la aplicación.

Almacenado en res/values/colors.xml.

Ejemplo:

<color name=“primary_color”>6200EE</color>
<color name=“secondary_color”>03DAC6</color>

5. Dimensiones: El tamaño y el relleno utilizado en el diseño.

Se almacena en res/values/dimens.xml.

Ejemplo:

<dimen name=“padding_small”>8dp</dimen>
<dimen name=“text_size_large”>24sp</dimen>

Acceso a los recursos a través de la clase R

Cuando se compila una app, Android genera automáticamente una clase R que contiene referencias a todos los recursos definidos en el directorio /res. Puede acceder a estos recursos a través de la clase R en el código del programa.

Ejemplo de acceso a cadenas:

String appName = getString(R.string.app_name);

Ejemplo de acceso a imágenes:

ImageView imageView = findViewById(R.id.my_image_view);
imageView.setImageResource(R.drawable.ic_launcher);

Ejemplo de acceso a un diseño:

setContentView(R.layout.activity_main);

Conclusión

Al comprender los componentes clave como Activity, Fragment, Intent y Service, puede crear aplicaciones de Android más eficientes, modulares y manejables. Cada componente tiene una función específica que permite que la aplicación funcione correctamente, tanto en primer plano como en segundo plano.

Además, componentes como Broadcast Receiver y Content Provider permiten que tu app responda a los cambios del sistema y comparta datos con otras apps.

Al aprovechar Application Manifest y Application Resources, puede definir la estructura de su aplicación y administrar activos como cadenas, imágenes y diseños de una manera más organizada.

Artículos Recientes