Android BroadcastReceiver: Manejo de Eventos a Nivel de Sistema

¿Qué es un BroadcastReceiver?

Un BroadcastReceiver es un componente de Android que escucha Intents de difusión a nivel del sistema o definidos por la aplicación y ejecuta lógica breve en respuesta. Es el mecanismo de publicación-suscripción de Android.

Fuentes de Difusión

  • Eventos del sistema: BOOT_COMPLETED, BATTERY_LOW, TIMEZONE_CHANGED, CONNECTIVITY_CHANGE, PACKAGE_INSTALLED
  • Hardware: conexión de auriculares, botón de la cámara, eventos de base
  • Otras aplicaciones: acciones personalizadas mediante sendBroadcast(), sendOrderedBroadcast()

Registro: Estático vs. Dinámico

Estático (Manifiesto)Dinámico (Context.registerReceiver)
Declarado en AndroidManifest.xmlRegistrado en código (Activity, Service, Application)
Siempre activo (incluso si la app no se ejecuta)Activo solo mientras vive el contexto que lo registra
Recibe difusiones implícitas y explícitasPuede recibir difusiones pegajosas (sticky)
Mayor impacto en batería (despierta la app)Menor impacto, ciclo de vida acotado
Requerido para BOOT_COMPLETEDPreferido para eventos relacionados con la UI

El Contrato de onReceive()

  • Se ejecuta en el hilo principal (a menos que se use goAsync())
  • Debe completarse en aproximadamente 10 segundos (riesgo de ANR)
  • Sin operaciones de UI — iniciar Activity/Service en su lugar
  • Difusiones ordenadas: puede llamar a abortBroadcast() y pasar el resultado al siguiente receptor

Patrones Comunes

// Registro en manifiesto <receiver android:name=".BootReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> // Registro dinámico (en Activity.onStart()) val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) registerReceiver(networkReceiver, filter) // En onStop() unregisterReceiver(networkReceiver) 

Alternativas Modernas (Android 8+)

  • JobScheduler / WorkManager: Ejecución diferida y garantizada con restricciones (carga, red, inactividad)
  • Servicio en primer plano: Tareas de larga duración con notificación visible al usuario
  • LiveData / Flow + Lifecycle: Actualizaciones reactivas de UI en lugar de espagueti de difusiones
  • Difusiones restringidas: Muchas difusiones implícitas ya no se entregan a receptores del manifiesto (por ejemplo, CONNECTIVITY_ACTION)

Mejores Prácticas

  • Mantener onReceive() mínimo — delegar a WorkManager/Service
  • Usar goAsync() para trabajos ligeramente más largos (aún < ~30s)
  • Establecer android:exported explícitamente (requerido para API 31+)
  • Validar acción e extras del Intent — no confiar ciegamente
  • Preferir registro dinámico para eventos acoplados a la UI

Resumen

BroadcastReceiver es el pegamento para la notificación de eventos entre componentes, aplicaciones y sistema-a-aplicación. Úsalo para desencadenantes breves; delega el trabajo real a WorkManager o Servicios.