Notificaciones
Recordatorio local para incentivar el registro diario, sin backend ni cuenta en la nube.
Resuelto con una notificación local: permiso POST_NOTIFICATIONS agregado al manifest, dependencia androidx.work:work-runtime-ktx incorporada, y un Worker propio (core/notificaciones/RecordatorioWorker.kt junto con Notificaciones.kt) que dispara el recordatorio diario. Implementado en la rama feature/notificacion-recordatorio (PR #21, commit "Se implementa notificacion local diaria con WorkManager para recordar registrar movimientos").
12.1 Detalle técnico
El recordatorio combina un permiso en tiempo de ejecución, un canal de notificaciones y una tarea periódica de WorkManager que dispara un CoroutineWorker. Ningún paso depende de un servidor: todo se programa y persiste en el propio dispositivo.
| Componente | Archivo | Responsabilidad |
|---|---|---|
| Canal de notificaciones | Notificaciones.kt | crearCanalRecordatorios() crea el NotificationChannel con IMPORTANCE_DEFAULT una sola vez (solo hace algo en API 26+); se llama en MainActivity.onCreate antes de pedir el permiso. |
| Permiso en tiempo de ejecución | MainActivity.kt | pedirPermisoNotificaciones (ActivityResultContracts.RequestPermission) solicita POST_NOTIFICATIONS en el primer arranque, requerido desde API 33 (Tiramisu). |
| Programación periódica | MainActivity.kt | programarRecordatorioDiario() arma un PeriodicWorkRequestBuilder<RecordatorioWorker>(1, TimeUnit.DAYS) y lo encola con enqueueUniquePeriodicWork(..., ExistingPeriodicWorkPolicy.KEEP, ...), para no duplicar la tarea si la app se vuelve a abrir. |
| Disparo | RecordatorioWorker.kt | CoroutineWorker mínimo: su doWork() solo llama a mostrarNotificacionRecordatorio() y devuelve Result.success(). |
| Construcción de la notificación | Notificaciones.kt | mostrarNotificacionRecordatorio() vuelve a comprobar el permiso con ContextCompat.checkSelfPermission antes de construir el NotificationCompat (prioridad DEFAULT, autoCancel = true). |
La respuesta del diálogo de permiso no cambia el flujo: programarRecordatorioDiario() se ejecuta siempre. Si el usuario negó el permiso, WorkManager sigue disparando el Worker cada día, pero mostrarNotificacionRecordatorio() revisa el permiso de nuevo y no construye la notificación —así que conceder el permiso más tarde (desde Ajustes) reactiva el recordatorio sin reprogramar nada—.
El intervalo real puede variar unos minutos frente a las 24 h configuradas: WorkManager respeta las políticas de batería de Android (Doze / App Standby) igual que con cualquier tarea periódica.
12.2 Captura
![]() |
![]() |
La notificación "No olvides registrar tus movimientos" confirma que el Worker dispara y que el texto y el ícono de la app se muestran correctamente en el centro de notificaciones. Queda pendiente que, al tocarla, abra la aplicación directamente en Registro en vez del destino por omisión (Resumen).

