Notificaciones

Recordatorio local para incentivar el registro diario, sin backend ni cuenta en la nube.

Estado actual

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.

Tabla 12.1 · Componentes del recordatorio y su responsabilidad
ComponenteArchivoResponsabilidad
Canal de notificacionesNotificaciones.ktcrearCanalRecordatorios() 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ónMainActivity.ktpedirPermisoNotificaciones (ActivityResultContracts.RequestPermission) solicita POST_NOTIFICATIONS en el primer arranque, requerido desde API 33 (Tiramisu).
Programación periódicaMainActivity.ktprogramarRecordatorioDiario() 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.
DisparoRecordatorioWorker.ktCoroutineWorker mínimo: su doWork() solo llama a mostrarNotificacionRecordatorio() y devuelve Result.success().
Construcción de la notificaciónNotificaciones.ktmostrarNotificacionRecordatorio() vuelve a comprobar el permiso con ContextCompat.checkSelfPermission antes de construir el NotificationCompat (prioridad DEFAULT, autoCancel = true).
Por qué se programa aunque el permiso se niegue

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

Notificación · claro
Notificación local de recordatorio en modo claro
Notificación · oscuro
Notificación local de recordatorio en modo oscuro

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).