android - 将 Android 应用排除在待机桶之外

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

在 Android 9 中,电池优化得到进一步推进,应用程序根据用户最近与应用程序交互的程度被分类到待机桶中(参见 Android documentation )。系统根据应用所在的存储桶限制每个应用可用的设备资源。

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

更具体地说,我有一个 PeriodicWorkRequest,它必须每 30 分钟运行一次,灵活度为 10 分钟。但是,如果我理解 table of imposed power restrictions如果我的应用程序被放入“稀有”桶中,这样的工作请求最多可以推迟 24 小时。 (在幕后,工作库使用作业调度程序。)

场景的更多细节

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

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

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

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

目前一切正常。唯一的问题是新型电池优化会在某个时间点减慢看门狗的速度。当然,我可以制定一项长期规定,强制所有员工偶尔打开应用程序并简单地看一下,但这有点愚蠢。

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

最佳答案

How can I keep my app in the "working set" bucket, even if the user does not interact with it?

不能不应该。同样documentation说:

Do not try to manipulate the system into putting your app into one bucket or another. The system's bucketing methods can change, and every device manufacturer could choose to write their own bucketing app with its own algorithm. Instead, make sure your app behaves appropriately no matter which bucket it's in.

即使是白名单也不适用于您的情况,因为:

the whitelisted app’s jobs and syncs are deferred

还有这个:

Note: Google Play policies prohibit apps from requesting direct exemption from Power Management features in Android 6.0+ (Doze and App Standby) unless the core function of the app is adversely affected.

关于android - 将 Android 应用排除在待机桶之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53434668/

相关文章:

c++ - 当计算机处于 sleep 状态时电源状态发生变化时,我可以收到通知吗?

java - 是否需要调用Lru Cache.evictAll();在 onDestroy() 方法中?

android - Google Maps V2 - Android - 获取标记列表

android - 以编程方式更改 ActionBar 图标

iOS CBCentralManager 在进入范围时不会在后台检测到 CBPeripheral

android - 如何从android中的进程获取应用程序名称?

android - 如何确保应用程序处于后台模式时 Flutter 进程不会被终止

android - 您如何解释 exynos SoC kmsg 中的 WAKEUP_STAT 和 WAKEUP_INTx_PEND?

macos - 读取 Magic Mouse 和 Apple 无线键盘的电池百分比

java - 如何在 Android Studio 完成之前停止正在运行的方法