Implementación de Broadcast Receivers en Android para Eventos del Sistema

Clase 32 de 33Curso 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?