Finalement, après de longues recherches sur Internet et des conseils courants comme la désactivation des optimisations de la batterie, des notifications adaptatives et de toutes ces fonctions qui n'ont pas aidé du tout, j'ai trouvé le forum XDA Developers où j'ai finalement trouvé la solution à ce problème.
Ce problème est causé par la fonctionnalité appelée "DOZE", qui est implémentée dans le noyau d'Android depuis Android 6.
https://developer.Android.com/training/monitoring-device-state/doze-standby
En gros, il s'agit d'essayer de préserver l'autonomie de la batterie du téléphone d'une manière très agressive qui met en veille toutes les applications et l'activité réseau jusqu'à ce que la fenêtre de maintenance se produise. La fenêtre de maintenance est une période très courte pendant laquelle tous les événements des applications en attente dans la file d'attente sont traités en une fois, puis toutes les applications sont remises en veille jusqu'à la prochaine fenêtre de maintenance.
Le problème est qu'à chaque nouvelle fenêtre de maintenance, les intervalles entre ces fenêtres augmentent chaque fois jusqu'à une longue limite. Ainsi, si vous n'avez pas touché votre téléphone pendant une longue période, par exemple une demi-heure, et que l'événement se produit, vous recevrez la notification dans la fenêtre de maintenance suivante, qui peut se situer quelques dizaines de minutes après cet instant.
Je ne sais pas comment Google peut agir comme si c'était OK. Ce n'est PAS le cas ! Pour moi, cela a causé de sérieux problèmes avec mon application de trading Forex qui n'affichait pas les alertes de prix au moment où l'événement se produisait mais 5, 15, 30 minutes ou même presque 1 heure plus tard ! ce qui n'est pas utile pour moi car l'opportunité du trade était déjà passée...
La solution est donc de désactiver le "DOZE" dans votre téléphone manuellement en utilisant les commandes ADB. Je l'ai fait et ça marche, maintenant j'ai des notifications instantanées. Malheureusement, cela doit être fait à chaque fois que le téléphone redémarre car il réactive lui-même le DOZE.
Voici une page avec plus de détails :
https://stackoverflow.com/questions/40204605/Android-completely-disabling-deviceidle-doze-in-Android-m
En gros, il suffit de lancer cette commande ADB : dumpsys deviceidle disable
Vous pouvez également placer l'application sur la liste blanche de Doze, mais je ne suis pas sûr que cela fonctionne. Lorsque j'ai affiché la liste, j'ai découvert que mon application de trading y figurait déjà. Je suppose qu'il n'utilise pas ces "messages FCM hautement prioritaires" décrits dans la description de DOZE pour forcer les notifications instantanément.
Si vous n'êtes pas familier avec ADB, voici quelques informations :
https://developer.Android.com/studio/command-line/adb
J'ai utilisé une application payante qui permet une connexion ADB locale depuis le téléphone directement, ainsi je peux désactiver DOZE après chaque redémarrage. Plus d'informations ici :
https://forum.xda-developers.com/t/say-hello-to-ladb-a-local-adb-shell-without-needing-Root-or-a-computer.4204855/
Il est très triste que cette fonctionnalité de base comme les notifications instantanées doivent être corrigées via l'interface de débogage du développeur par l'utilisateur au lieu de Google qui pourrait le faire dans le système d'exploitation lui-même... honte à Google....
Plus de forums sur ce sujet :
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