# Arquitectura de alarmas con pantalla apagada ## Diagnóstico El flujo anterior hacía que Android recibiese la alarma con `AlarmManager`, pero el sonido real dependía de que se abriese `MainActivity` y de que Flutter llegase a pintar `PantallaAlarmaSonando`. Con pantalla apagada, Doze o restricciones del fabricante, ese arranque de UI puede retrasarse hasta que el usuario enciende la pantalla. ## Decisión La alarma debe sonar desde Android nativo en cuanto llega `ACTION_FIRE`. Flutter pasa a ser la interfaz de control para detener, posponer y hacer handoff a la radio de la app, pero no el único origen del sonido. ## Flujo recomendado 1. `AlarmScheduler` programa la alarma con `setAlarmClock` y fallback exact/inexact. 2. `PluriWaveAlarmReceiver` recibe `ACTION_FIRE`. 3. El receiver arranca `PluriWaveAlarmService` como foreground service. 4. El servicio toma un `PARTIAL_WAKE_LOCK`, muestra notificación foreground y reproduce audio con `USAGE_ALARM`. 5. La UI Flutter se abre por full-screen intent si Android lo permite. 6. Al detener/posponer desde Flutter, se manda comando nativo para parar el servicio. ## Referencias - Android alarms: https://developer.android.com/develop/background-work/services/alarms - Foreground service restrictions: https://developer.android.com/develop/background-work/services/fgs/restrictions-bg-start - AOSP DeskClock AlarmService: https://android.googlesource.com/platform/packages/apps/DeskClock/+/ac260c0096605526f772af7eec73d6a51dc6de32/src/com/android/deskclock/alarms/AlarmService.java ## Notas - El audio local interno es el fallback más fiable para pantalla apagada. - La radio remota puede fallar por red, DNS, TLS o timeout; por eso debe existir fallback interno. - Si un fabricante bloquea incluso servicios arrancados desde alarma, habrá que guiar al usuario con permisos de batería/autostart.