WorkManager 的 setRequiresDeviceIdle 设定有些令人困惑

8
我已经实现了一个定时工作管理器。 我的想法是每两个小时完成一个进程。 但我需要确保该进程得到执行。 根据Work Manager的文档,每个进入队列的进程都将得到保证执行。
但是现在这个setRequiresDeviceIdle让我感到困惑。 文档中指出,默认情况下setRequiresDeviceIdle被设置为false。 所以我认为如果设备处于空闲模式,我的进程将无法正常工作。
空闲模式 = 当手机屏幕关闭一段时间后
但是,如果我将此setRequiresDeviceIdle设置为true。 我认为现在它只有在设备处于空闲模式时才会工作。
我希望即使设备处于空闲或非空闲状态,进程也能完成。现在该怎么办?

1
此方法的默认约束为false,意味着您的工作将特别运行,传入true将限制该条件。因此,一旦为真,意味着工作只会在空闲状态下运行。 - Jeel Vankhede
3
对我来说,那基本上没问题。我的问题是如何在任何情况下(空闲和非空闲)都能运行?如何实现这种行为? - Mudassir Zulfiqar
1个回答

4
如果您查看WorkManager文档,您会发现:

requiresDeviceIdle boolean: true表示设备必须处于空闲状态才能运行工作

如果传递true,则意味着只有在设备处于空闲状态时才会执行您的工作。
由于您希望任务始终执行,因此应在setRequiresDeviceIdle()中传递false
请注意: 您的任务不一定会在2小时后准确执行。根据文档,您的任务可能被推迟到下一个维护窗口。您的任务肯定会执行,但持续时间可能会略长于2小时。

在Doze模式下,系统通过限制应用程序对网络和CPU密集型服务的访问来尝试节省电池电量。它还防止应用程序访问网络并推迟其作业、同步和标准警报。

定期地,系统退出Doze模式,以便让应用程序完成其延迟的活动。在此维护窗口期间,系统运行所有待处理的同步、作业和警报,并允许应用程序访问网络。

如果您希望任务始终在精确时间执行,可以使用Alarm ManagersetExactAndAllowWhileIdle()。但是这种做法是不被鼓励的,因为它对电池性能不利。

1
抱歉,但我从你的回复中读到了混杂的信息。在第一部分中,我感觉工作程序会在设备处于Doze模式时运行(“仅在设备处于空闲状态时执行”)。但是在第二部分中,我感觉它只会在维护窗口中运行。因此,假设我想让我的周期性工作程序在Doze模式下大约每15分钟运行一次。我无法理解是否可以使用setRequiresDeviceIdle()实现这一点。 - JHowzer
1
@JHowzer的setRequiresDeviceIdle()doze mode完全不同,它们之间没有关联。如果你设置了setRequiresDeviceIdle(true),那么任务只会在设备处于“空闲”状态时执行。而setRequiresDeviceIdle(false)则可以在应用程序运行或不在待机状态下执行任务。“空闲”被认为是Doze模式激活的时间。 - ankuranurag2
回到你的问题,使用setRequiresDeviceIdle()是可以实现你的用例的。唯一的问题是周期时间不会完全是15分钟。维护窗口是doze模式的一部分,在这个模式下所有延迟任务都被捆绑在一起执行。 - ankuranurag2
3
这也让我感到困惑。对我来说,setRequiresDeviceIdle(true) 强制产生了利益冲突:它表明你希望作业仅在设备决定进入空闲状态时运行...当它想执行任何工作时? - drmrbrewer
3
设备何时处于空闲状态?它的定义是什么? - JohnyTex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接