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.xml | Registrado 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ícitas | Puede recibir difusiones pegajosas (sticky) |
| Mayor impacto en batería (despierta la app) | Menor impacto, ciclo de vida acotado |
Requerido para BOOT_COMPLETED | Preferido 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:exportedexplí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.
- ·Diferencia entre transmisor y receptor
- ·Problemas con receptor Viewsat VS2000 (FTA)
- ·Receptores AV compatibles DTS-HD Master Audio
- ·Potencia del Harman Kardon HK 3300
- ·Solución de problemas del Technics SA-DX930
- ·Cómo utilizar un receptor estéreo como preamplificador
- ·Cómo conectar un sistema estéreo Pioneer en casa
- ·Zumbido (hum) en Bose Wave AWRC-1G
