- 这个机制的具体工作原理是什么?
- 检测算法如何收集数据?
- 消息被降低优先级的时间有多长?
其次,Android应用程序有一个方法来检查最近接收到的消息的年龄。如果具有普通优先级的消息尚未传递但仍存储在FCM服务器上,则此方法有时会报告错误结果。问题如下:
- 如何让Android应用程序先获取所有消息?
一些可选的背景信息:
我正在编写一个监控某些安全关键应用程序的应用程序。On-premise服务器可以处于两种互斥的状态之一:"空闲"或"警报"。该状态通过FCM发送到所有注册的客户端。为了确保服务器仍在运行,该状态定期广播为心跳。这些心跳消息以普通优先级发送。此外,每当状态从“空闲”更改为“警报”时,将立即发送具有高优先级的其他消息。例如,消息序列类似于
... idle idle idle *alarm* alarm alarm alarm idle idle ...
当一系列警报信息中的第一个触发通知时,所有其他信息仅具有普通优先级,因此(希望)不会被FCM降低优先级。
Android应用程序包含一个PeriodicWorkRequest
,它充当看门狗并检查心跳是否仍在进行。如果最近接收到的消息太旧(超过30分钟),则向用户显示“连接已断开”的通知以警告用户。
问题在于:
通常的心跳消息具有普通优先级,并且在FCM服务器上缓存。看门狗会引发错误的“连接已断开”通知。设备被唤醒(由于通知),然后最新的心跳消息突然进入(它们在服务器上合并)。
我看到两个解决方案(或变通方法):
将所有消息设置为高优先级消息,以便立即传递它们并使看门狗始终看到最新消息。但是,我担心FCM降低优先级算法会启动。(99.95%是无聊的“空闲”消息)
在看门狗检查最新消息的时间并最终引发警告之前,我必须以编程方式确保已获取所有消息。
附注:
我完全理解为什么谷歌越来越强制执行后台执行和异步任务的限制。(广播接收器变得越来越无用,AlarmManager受到限制,JobScheduler可以被推迟,Android 9引入了“待机捆绑”概念。)许多开发人员滥用这些API来做疯狂的事情,而存在更好(省电)的解决方案。然而,所有这些限制使实现受法律规定约束、必须提供可靠性保证并因此需要监控不可靠网络的安全关键应用程序变得非常困难。
所有电源管理机制似乎都没有考虑与安全相关的场景。用户没有意图使用该应用程序(这完全正常),在这种特殊情况下,没有新闻就是好新闻。即应用程序只停留在后台。不幸的是,该应用程序被归类为“罕见”应用程序的待机捆绑,并且该应用程序受到惩罚,这是不好的。