Broadcast Receivers para escuchar eventos del sistema en Android
Clase 32 de 33 • Curso de Android: Integración de APIs nativas
Contenido del curso
- 7

Emisión controlada de tiempo con Kotlin Flows
12:55 - 8

Simulación de ubicación GPS en emulador y dispositivo Android
05:48 - 9

Modelos de localización personalizados con Clean Architecture en Kotlin
08:36 - 10

Mapeo de datos de localización en Android con Kotlin
14:51 - 11

Inyección de dependencias para observar localización en Android
06:33 - 12

StateFlow para controlar localización en aplicaciones Android
08:47 - 13

State Flows para controlar localización y tiempo en Kotlin
10:00 - 14

Configuración y pruebas de Location Tracker en Android
09:37 quiz de Servicios de Localización
- 15

Integración de ubicación actual en mapas interactivos
06:46 - 16

Creación de polilíneas con datos reales en mapas de Android
04:07 - 17

Integración de intents y estados en pantalla mapa con Compose
08:05 - 18

Implementación del ViewModel para rastreo de localización en Android
14:29 quiz de Integración Maps con Localización
- 19

Gestión de permisos en tiempo de ejecución para aplicaciones Android
08:34 - 20

Creación de diálogos de permisos reutilizables en Android
06:55 - 21

Gestión de permisos de localización y notificaciones en Android
10:18 - 22

Implementación de solicitud de permisos con LaunchedEffect en Compose
09:53 quiz de Manejo de permisos
- 23

Implementación de PhotoHandler para gestión de cámara en Android
11:59 - 24

Conversión de Bitmaps a Byte Arrays con Extension Functions
05:58 - 25

Definición de Intents y estados de UI para cámara en Kotlin
08:41 - 26

Configuración de métodos del ViewModel para gestión de cámara
09:41 - 27

Integración de CameraX con Jetpack Compose en Android
14:23 - 28

Creación de pantalla de previsualización de fotos con Jetpack Compose
08:44 - 29

Integración de galería fotográfica en mapas con Jetpack Compose
11:56 quiz de Integración cámara
Escuchar y responder a eventos específicos es fundamental en aplicaciones Android. Los broadcast receivers son precisamente los encargados de escuchar eventos emitidos por el sistema operativo o eventos personalizados creados por la aplicación. Eventos comunes incluyen conexiones USB o cambios en el modo avión.
¿qué es un Broadcast Receiver?
Un broadcast receiver es un componente esencial para reaccionar a eventos específicos que se generan dentro o fuera de una aplicación. Pueden escuchar desde eventos del propio sistema operativo hasta eventos personalizados definidos por el desarrollador.
¿Cómo crear un Broadcast Receiver personalizado?
Crear un receptor propio requiere definir una clase que extienda de BroadcastReceiver e implemente el método onReceive:
class StopReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val action = intent?.action ?: return
if (action != ACTION_STOP) return
// Lógica para detener la actividad o servicio pertinente.
}
companion object {
const val ACTION_STOP = "trackit.action.stoptracking"
}
}
Para manejar eventos con eficacia, es importante validar que el mensaje recibido no sea nulo y coincida con la acción esperada.
¿Qué operaciones se ejecutan al recibir un evento?
Al recibir el evento de detención, es necesario realizar una serie de tareas que involucran:
- Establecer el estado de tracking como desactivado.
- Detener la observación de la localización.
- Limpiar recursos, como fotografías almacenadas.
Estas tareas son realizadas habitualmente sobre un scope de coroutine, asegurando la finalización de cada proceso:
applicationScope.launch {
locationTracker.setIsTracking(false)
locationTracker.stopObservingLocation()
photoHandler.clearPhotos().join()
}
Tras esto, se envía un comando para detener el servicio asociado:
val serviceIntent = Intent(context, TrackingService::class.java).apply {
action = TrackingService.ACTION_STOP
}
if (TrackingService.isActive.value) {
context?.startService(serviceIntent)
}
¿Cómo registrar un Broadcast Receiver en Android?
Todos los receptores deben registrarse correctamente desde el archivo Manifest de la aplicación:
<receiver android:name=".StopReceiver" android:exported="false"/>
El parámetro exported indica si otras aplicaciones podrían activar este receptor; habitualmente, se establece en false.
¿De qué forma interactúa un Broadcast Receiver con notificaciones?
El uso de un pending intent permite agregar acciones a las notificaciones, enviando mensajes a nuestro receptor para ejecutar eventos específicos aunque la aplicación esté cerrada:
val stopIntent = Intent(applicationContext, StopReceiver::class.java).apply {
action = StopReceiver.ACTION_STOP
}
val stopPendingIntent = PendingIntent.getBroadcast(applicationContext, 0, stopIntent, PendingIntent.FLAG_IMMUTABLE)
Al incorporar esta intención en la notificación, se vincula la interacción del usuario directamente al receptor personalizado:
notificationBuilder.addAction(R.drawable.ic_launcher_foreground, applicationContext.getString(R.string.stop), stopPendingIntent)
Al pulsar esta acción en la notificación, la aplicación se activa y ejecuta las tareas correspondientes establecidas en el receptor de eventos.
¿Has utilizado antes broadcast receivers para manejar eventos específicos en tus aplicaciones? Comparte tu experiencia o dudas en los comentarios.