将Android应用排除在待命状态之外

时间:2018-11-22 16:04:07

标签: android background-process power-management android-powermanager

借助Android 9,电池优化得到了进一步的推动,并且根据用户最近与应用程序进行了多少互动,应用程序被划分为备用存储桶(请参见Android documentation)。系统会根据应用所在的存储桶限制每个应用可用的设备资源。

即使用户没有与之交互,如何将我的应用保存在“工作集”存储桶中? (我没有找到任何权限或类似权限可以覆盖此电源管理功能。)

更具体地说,我有一个PeriodicWorkRequest,它必须每30分钟运行一次,灵活性为10分钟。但是,如果我了解table of imposed power restrictions,并且将我的应用放入“稀有”存储区,则这样的工作请求可能会延迟24小时。 (在后台,工作库使用工作计划程序。)

有关该场景的更多详细信息

该应用程序对安全性至关重要,不适合公众使用,仅对有限的一组用户有意义。但是,如果其他任何人使用此应用程序,也不会发生任何不良情况,但是该应用程序对他/她没有任何作用。

更准确地说,该应用程序已连接到特定建筑物的中央火灾报警站。要求所有员工在其智能手机上安装该应用程序。如果该建筑物的中央火灾警报站检测到事件,它将(通过FCM)发送推送通知到所有已注册的智能手机,并且该应用会播放警报声。这意味着(希望)长时间没有任何反应,并且用户无意以任何方式与应用进行交互。该应用程序本身不提供任何交互功能,它仅说明当前状态(绿色“ OK”符号或红色“ ALERT”符号),并在后台等待其余时间。

由于该应用程序对安全至关重要,因此必须检测该应用程序断开与服务器的连接的故障情况。为此,服务器实际上会定期在后台发送消息,即序列idleidleidleidle alarm < / strong>,alarmalarmalarm idle idleidle,...通常,每5分钟以低FCM优先级广播消息。如果状态发生变化,则会立即以高FCM优先级(cp。粗体字母)发送一条附加消息。

应用程序使用PeriodicWorkRequest来实现看门狗,如上面的问题所述。该看门狗有两个作用:唤醒设备,使设备接收所有已推迟的(低优先级)FCM消息,然后检查最新消息是否不早于1.5 * 5min。如果失败,则该应用尝试在服务器上重新注册自己,并等待状态消息再次开始出现。如果仍然失败,则该应用会向用户显示警告。

到目前为止,一切正常。唯一的问题是新型电池优化,它会在某个时间点降低看门狗的速度。当然,我可以颁布一项强制性规定,强迫所有员工不时打开该应用程序并对其进行简单查看,但这有点愚蠢。

我可以重新表述上面的问题:我完全理解Android为什么将电池优化推向了边缘。有很多(疯狂的)应用程序滥用了定期任务,而这些任务本应以不同的方式解决。网络上仍然充满了“愚蠢的”编程建议,例如每5秒检查一次特定网页的修改。但是,如果电池优化越来越成为一个障碍,那么我应该如何编写要求看门狗用于安全目的的安全关键型应用程序。 Google的规则“如果用户不使用您的应用,显然对他/她不重要”,则不适用于此。

2 个答案:

答案 0 :(得分:0)

  

即使用户没有与之交互,如何将我的应用保存在“工作集”存储桶中?

不能,并且不应该。同样的documentation说:

  

请勿尝试操纵系统将您的应用放入一个或多个存储桶。系统的存储方式可以更改,每个设备制造商都可以选择使用自己的算法编写自己的存储应用。相反,请确保您的应用程序无论位于哪个存储桶中,都能正常运行。

即使在您的情况下,即使列入白名单也不起作用,因为:

  

列入白名单的应用的工作和同步被推迟

这也是:

  

注意:Google Play政策禁止应用程序直接要求Android 6.0+(打ze和应用程序待机)中的电源管理功能免除,除非该应用程序的核心功能受到不利影响。

答案 1 :(得分:0)

如果您的应用是特定于站点的并且不是从 Play 商店分发的,您可以要求您的用户为您的应用禁用电池优化。这将使您的应用程序免于备用应用程序分桶系统。显然,必须通过一堆菜单来禁用一些晦涩的功能并不是一种很好的用户体验,但考虑到您正在考虑强制用户手动打开应用程序,禁用电池优化会更可取。