Finalmente, después de una larga búsqueda en Internet y de probar consejos comunes como desactivar las optimizaciones de la batería, las notificaciones adaptativas y todas esas características que no ayudaron en absoluto, encontré el foro de XDA Developers donde finalmente llegué al fondo de este problema.
Este problema es causado por la funcionalidad llamada "DOZE", que está implementada en el núcleo de Android desde Android 6.
https://developer.Android.com/training/monitoring-device-state/doze-standby
Básicamente lo que hace es que trata de preservar la vida de la batería del teléfono de una manera muy agresiva que básicamente pone todas las aplicaciones y la actividad de la red en espera hasta que se produzca la ventana de mantenimiento. La ventana de mantenimiento es un período de tiempo muy corto en el que todos los eventos de las aplicaciones que esperan en la cola se procesan a la vez y luego pone todas las aplicaciones en espera de nuevo hasta que se produce la siguiente ventana de mantenimiento.
El problema es que con cada ventana de mantenimiento siguiente los intervalos entre esas ventanas aumentan cada vez hasta un límite largo. Así que si usted no ha tocado su teléfono durante un tiempo más largo, como media hora y el evento ocurre, obtendrá la notificación en la próxima ventana de mantenimiento que puede ser decenas de minutos desde ese momento.
No sé cómo Google puede actuar como si esto estuviera bien. No lo está. Para mí estaba causando serios problemas con mi aplicación de comercio de divisas que no muestra las alertas de precios en el tiempo cuando el evento ocurrió, pero como 5, 15, 30 minutos o incluso casi 1 hora más tarde !! que no es útil para mí porque la oportunidad para el comercio ya se había ido ...
Así que la solución es desactivar el "DOZE" en su teléfono manualmente utilizando los comandos ADB. Yo lo hice y funciona, ahora tengo notificaciones instantáneas. Por desgracia, esto tiene que hacerse cada vez después de reiniciar el teléfono, ya que se convierte en el DOZE de nuevo.
Aquí hay una página con más detalles:
https://stackoverflow.com/questions/40204605/Android-completely-disabling-deviceidle-doze-in-Android-m
Básicamente, sólo tienes que emitir este comando ADB: dumpsys deviceidle disable
También se puede poner la aplicación en la lista blanca de Doze pero no estoy seguro de que funcione, cuando desplegué la lista, me encontré con que mi app de comercio ya estaba allí, tal vez porque la eliminé de la política de ahorro de batería pero probablemente el Doze seguía suspendiendo todo por lo que funcionaba sólo en esos Windows de mantenimiento. Supongo que no utiliza esos "mensajes FCM de alta prioridad" descritos en la descripción de DOZE para forzar las notificaciones al instante.
Si no estás familiarizado con el ADB, aquí tienes algo de información:
https://developer.Android.com/studio/command-line/adb
Utilicé una aplicación de pago que permite la conexión local ADB desde el teléfono directamente, así puedo desactivar DOZE después de cada reinicio. Más información aquí:
https://forum.xda-developers.com/t/say-hello-to-ladb-a-local-adb-shell-without-needing-Root-or-a-computer.4204855/
Es muy triste que esta característica básica como son las notificaciones instantáneas tengan que ser arregladas a través de la interfaz de depuración de desarrolladores por el usuario en vez de por Google que podría arreglarlo en el propio SO...vergüenza de Google....
Más foros sobre este tema:
https://forum.xda-developers.com/t/psa-how-to-fix-the-notification-delay-or-non-receipt-issue-truly-pathetic-of-google-and-samsung.4276505/
https://forum.xda-developers.com/t/delayed-notification-problems-s21-ultra.4243105/page-5
0 votos
¿Ha encontrado alguna forma de hacerlo correctamente?