Live Updates de Android 16: llevar el temporizador de enfoque de Mintly a la pantalla de bloqueo
Una guía práctica sobre las notificaciones centradas en el progreso de Android 16 — segmentos de ProgressStyle, notificaciones continuas promovidas y lo que aportan a un temporizador Pomodoro activo.
Un temporizador que solo existe dentro de la app es un temporizador que nadie consulta. Todo el sentido de una sesión Pomodoro es dejar de vigilarlo — echas un vistazo a la pantalla de bloqueo cuando resurges, ves cuánto tiempo de concentración queda y vuelves al trabajo. Android 16 por fin da una respuesta real a ese vistazo para las notificaciones continuas: Live Updates, un tipo de notificación promovida construido sobre ProgressStyle, que se gana un lugar en la pantalla de bloqueo y una insignia compacta en la barra de estado en lugar de perderse entre el resto. Esto es lo que hace en realidad, y cómo cambió la notificación que muestra Mintly durante una sesión.
Qué aporta un Live Update frente a una notificación continua normal
Una notificación continua, no descartable, con una barra de progreso lleva años funcionando en Android — así era la notificación del temporizador de Mintly antes de esto. Lo que no conseguía era una ubicación prioritaria. Una notificación continua normal se sienta en la bandeja junto a todo lo demás, y en un teléfono con una lista de notificaciones cargada, es una fila más entre muchas.
Un Live Update está a una llamada de Notification.Builder de distancia del mismo contenido, pero el sistema lo trata de forma diferente: es elegible para mostrarse en la pantalla de bloqueo incluso cuando otras notificaciones están colapsadas, y en dispositivos compatibles puede aparecer como una pequeña insignia en vivo cerca del reloj de la barra de estado. El sistema decide si realmente concede esa ubicación promovida — solicitarla no la garantiza — pero para los tipos de notificación que Android diseñó para esto (un viaje que se acerca, un pedido en camino, un temporizador contando hacia atrás), es la diferencia entre “el usuario tiene que desbloquear y desplegar la bandeja” y “el usuario lo lee en la pantalla de bloqueo sin tocar nada”.
Integrar ProgressStyle en una notificación de temporizador
El estilo en sí es una pequeña adición sobre una notificación que ya estás construyendo:
val progressStyle = NotificationCompat.ProgressStyle()
.setProgress(elapsedSeconds)
.setProgressMax(totalSeconds)
.setProgressIndeterminate(false)
val notification = NotificationCompat.Builder(context, CHANNEL_FOCUS_SESSION)
.setContentTitle("Focus session")
.setContentText(formatRemaining(totalSeconds - elapsedSeconds))
.setSmallIcon(R.drawable.ic_mintly_timer)
.setOngoing(true)
.setOnlyAlertOnce(true)
.setStyle(progressStyle)
.setRequestPromotedOngoing(true)
.build()
El único ajuste que merece detenerse es setRequestPromotedOngoing(true). Es una solicitud, no un interruptor — la plataforma puede rechazarla, y está pensada para notificaciones que representan de verdad algo que el usuario está esperando activamente ahora mismo, no una forma genérica de saltarse la cola. Un temporizador que realmente está en marcha califica. Una notificación obsoleta que quedó de una sesión terminada hace diez minutos no, y la propia heurística de la plataforma empezará a ignorar las solicitudes de promoción de una app que las pide cuando en realidad no hay nada en curso.
Los segmentos convierten una barra en un mapa real de la sesión
La parte que hizo que valiera la pena adoptar esto en Mintly no fue la ubicación en la pantalla de bloqueo por sí sola — fue el soporte de segmentos de ProgressStyle. En lugar de una única barra continua, puedes describir el progreso como una secuencia de rangos coloreados, lo que encaja directamente con cómo está estructurada en realidad una sesión Pomodoro: bloque de trabajo, descanso corto, bloque de trabajo, descanso más largo.
val segments = listOf(
ProgressStyle.Segment(25 * 60).setColor(mintlyFocusColor),
ProgressStyle.Segment(5 * 60).setColor(mintlyBreakColor),
ProgressStyle.Segment(25 * 60).setColor(mintlyFocusColor),
ProgressStyle.Segment(15 * 60).setColor(mintlyLongBreakColor),
)
progressStyle.setProgressSegments(segments)
Ese único cambio responde a una pregunta que la antigua barra de progreso plana nunca pudo: no solo “cuánto tiempo queda en esta sesión”, sino “en qué punto del ciclo estoy y a cuánto está el próximo descanso real”. Los puntos son el otro elemento que ofrece ProgressStyle — pequeñas marcas a lo largo de la barra — y encajan de forma natural con puntos de control de interrupciones, aunque Mintly todavía no los usa.
El modo de fallo: tratarlo como decoración
Es tentador añadir ProgressStyle y la solicitud de promoción a cada notificación continua que tenga una app, porque la superficie de la API es pequeña y la mejora visual es real. Ese es el instinto equivocado. Live Updates existe para una categoría estrecha — algo acotado en el tiempo y realmente en curso, que le importa al usuario ahora mismo — y la plataforma vigila las apps que solicitan promoción fuera de esa categoría. Una app que promueve un aviso de “no has abierto esto en 3 días” disfrazado de barra de progreso es exactamente el caso de abuso que esta función se diseñó para evitar, y las solicitudes abusivas repetidas son el tipo de cosa que puede hacer que las futuras solicitudes de promoción de una app se degraden silenciosamente en prioridad.
La prueba honesta antes de añadir setRequestPromotedOngoing(true) en cualquier sitio: ¿hay un proceso real y en marcha detrás de esta notificación, que termina en un momento concreto que el usuario puede predecir a partir de la propia barra? Para un temporizador de enfoque, sí en todos los aspectos. Para la mayoría de los demás tipos de notificación en una app local-first típica, no — y la notificación sencilla que ya tienes es la que conviene mantener.
Lo que esto no sustituye
Live Updates cambia dónde se ve la notificación del temporizador. No cambia si se dispara de forma fiable en primer lugar — eso sigue dependiendo del servicio en primer plano y de las matemáticas de hora de finalización en tiempo real de las que Mintly ya depende para sobrevivir a Doze y a la muerte del proceso. ProgressStyle y la solicitud de promoción se apoyan sobre esa base; son una capa de presentación, no un sustituto de hacer bien el temporizador subyacente. Construye primero la versión fiable. La insignia en la pantalla de bloqueo merece añadirse cuando eso ya no esté en duda — no antes.
// Lecturas relacionadas
Más del diario
Tipos de servicio en primer plano en Android en 2026: elegir el que realmente encaja con tu función
Una guía práctica sobre las restricciones de tipos de servicio en primer plano de Android — dataSync, mediaPlayback, specialUse, shortService — y cómo elegir el correcto sin que te lo maten o te lo rechacen.
Canales de notificación en Android en 2026: diseñar niveles de importancia que los usuarios no silenciarán
Una guía práctica sobre los canales de notificación de Android — niveles de importancia, grupos de canales, por qué la configuración se congela tras crearlos y cómo migrarlos sin perder la confianza del usuario.
Construyendo Mintly: mantener un temporizador de enfoque preciso cuando Android quiere matar el proceso
Un temporizador Pomodoro en ejecución tiene un problema de fiabilidad más difícil que un recordatorio puntual. Así es como Mintly sobrevive al modo Doze, a la muerte del proceso y al desfase con la pantalla apagada, con un servicio en primer plano y una hora de fin en tiempo real.