我还在处理手机中大多数应用程序中的延迟通知。最后,在互联网上进行了长时间的搜索并尝试了禁用电池优化、自适应通知和所有那些根本没有帮助的功能等常见建议后,我找到了 XDA 开发者论坛,我终于找到了这个问题的根源。
此问题是由称为“DOZE”的功能引起的,该功能自 Android 6 起在 Android 核心中实现。
https://developer.android.com/training/monitoring-device-state/doze-standby
基本上它所做的是它试图以一种非常激进的方式保持手机电池寿命,基本上将所有应用程序和网络活动置于待机状态,直到出现维护窗口。维护窗口是一个非常短的时间段,其中来自队列中等待的应用程序的所有事件被立即处理,然后它使所有应用程序再次进入待机状态,直到下一个维护窗口发生。
问题是,随着每个下一个维护窗口,这些窗口之间的间隔每次都会增加,直到某个长期限制。因此,如果您有较长时间(例如半小时)没有触摸手机并且事件发生,您将在下一个维护窗口中收到通知,该窗口可能是从那一刻起的几十分钟。
我不知道谷歌可以如何行事,因为这没问题。它不是!!对我来说,这导致我的外汇交易应用程序出现严重问题,在事件发生时没有按时显示价格警报,而是在 5、15、30 分钟甚至近 1 小时后显示!这对我没有用,因为交易的机会已经消失了......
因此解决方案是使用 ADB 命令手动禁用手机中的“打瞌睡”。我做到了,它有效,现在我收到即时通知。不幸的是,每次手机重启后都必须这样做,因为它会再次打开打盹。
这是一个包含更多详细信息的页面:
Android:在 Android M 中完全禁用 deviceidle(“Doze”)?
基本上你只需发出这个 ADB 命令:dumpsys deviceidle disable
您也可以将应用程序放入 Doze 白名单,但不确定它是否有效,当我显示列表时,我发现我的交易应用程序已经存在,可能是因为我将其从省电政策中删除但 Doze 可能仍在暂停一切,所以它只在那些维护窗口中工作。我猜它不会使用 DOZE 描述中描述的那些“高优先级 FCM 消息”来立即强制通知。
如果您不熟悉 ADB,这里有一些信息:
https://developer.android.com/studio/command-line/adb
我使用了一个付费应用程序,它允许直接从手机连接本地 ADB,所以我可以在每次重启后禁用 DOZE。更多信息在这里:
https://forum.xda-developers.com/t/say-hello-to-ladb-a-local-adb-shell-without-needing-root-or-a-computer.4204855/
令人遗憾的是,作为即时通知的基本功能必须由用户通过开发人员调试界面而不是谷歌来修复,谷歌可以在操作系统本身中修复它......谷歌感到羞耻......
有关此主题的更多论坛:
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