Implementación de Broadcast Receivers en Android para Eventos del Sistema
Clase 32 de 33 • Curso de Android: Integración de APIs nativas
Resumen
Comprender cómo funcionan los Broadcast Receivers en Android es clave al momento de desarrollar aplicaciones receptivas y eficientes. Estos receptores permiten escuchar y responder ante eventos específicos del sistema operativo o personalizados, como conectar un USB o activar el modo avión.
¿qué son los Broadcast Receivers en Android?
Los Broadcast Receivers son componentes diseñados para estar atentos a eventos emitidos por Android. Algunos ejemplos comunes son:
- Conexión de accesorios, como cables USB.
- Cambio de estados en el dispositivo, como activar o desactivar el modo avión.
Este componente no se limita solo a eventos del sistema, también se pueden crear y escuchar eventos definidos específicamente en la aplicación.
¿cómo crear y registrar un Broadcast Receiver en Android?
Crear un Broadcast Receiver implica definir una clase que herede directamente del BroadcastReceiver provisto por Android y sobreescribir su método onReceive
para captar los eventos emitidos:
class StopReceiver : BroadcastReceiver() {
private lateinit var photoHandler: PhotoHandler
private lateinit var locationTracker: LocationTracker
private val applicationScope = CoroutineScope()
companion object {
const val ACTION_STOP = "TrackIt.Action.StopTracking"
}
override fun onReceive(context: Context?, intent: Intent?) {
val action = intent?.action ?: return
if (action != ACTION_STOP) return
applicationScope.launch {
locationTracker.setIsTrackingToFalse()
locationTracker.stopObservingLocation()
photoHandler.clearPhotos().join()
val serviceIntent = Intent(context, TrackingService::class.java).apply {
this.action = TrackingService.ACTION_STOP
}
if (TrackingService.isActive.value) {
context?.startService(serviceIntent)
}
}
}
}
Posteriormente, es importante registrar el BroadcastReceiver en el archivo AndroidManifest.xml
indicando explícitamente que no se desea que otras aplicaciones invoquen este receptor:
<receiver android:name=".StopReceiver" android:exported="false" />
¿cómo invocar el Broadcast Receiver desde una notificación?
Para interactuar con el Broadcast Receiver, especialmente desde una notificación cuando la aplicación está en segundo plano o cerrada, es necesario asignar un PendingIntent
que dispare el receptor:
val stopIntent = Intent(applicationContext, StopReceiver::class.java).apply {
action = StopReceiver.ACTION_STOP
}
val stopPendingIntent = PendingIntent.getBroadcast(
applicationContext,
0,
stopIntent,
PendingIntent.FLAG_IMMUTABLE
)
val notificationAction = NotificationCompat.Action(
R.drawable.launcher_foreground,
applicationContext.getString(R.string.stop),
stopPendingIntent
)
// Por último, se añade esta acción a la notificación.
notificationBuilder.addAction(notificationAction)
Con esta configuración, al presionar el botón de "Stop" en la notificación, el Broadcast Receiver captará la acción y ejecutará las tareas que hayas definido, como detener servicios o liberar recursos.
¿Has trabajado antes con Broadcast Receivers? ¿Qué otras aplicaciones prácticas se te ocurren para estos receptores?