我一直在尝试找出如何使用任何后台任务API来创建工作请求,该工作请求每天在特定时间在运行Android 8.0+的设备上触发。 时间必须由用户在设备上本地设置(表示没有GCM)。
还有可能吗?带有AlarmManager
的旧版设备可以产生奇迹,但是就我所知,在应用程序被强制停止时,所有待处理的意图都被清除了,所以现在不行了。
WorkManager
的{{1}}不允许您设置开始工作的时间。我研究过创建延迟的PeriodicWorkRequest
并计划下一个运行后的运行,但是没有什么可以确保这项工作能够按我希望的时间运行。
Evernote的OneTimeWorkRequest
库也与Android-Job
(https://github.com/evernote/android-job/issues/318)有关。
欢迎任何建议/想法。
答案 0 :(得分:1)
您可以只使用sendEvent:
来安排自身的副本,然后返回OneTimeWorkRequest
。
Result
使用以下命令开始第一个工作请求:
class TestWorker: Worker() {
fun doWork(): Result {
val nextWorkRequest = OneTimeWorkRequestBuilder<TestWorker>()
nextWorkRequest.withInitialDelay(24, TimeUnit.HOURS)
WorkManager.getInstance().enqueue(nextWorkRequest)
return Result.SUCCESS;
}
}
因此,您得到的东西看起来像 val firstWorkRequest = OneTimeWorkRequestBuilder<TestWorker>()
nextWorkRequest.withInitialDelay(24, TimeUnit.HOURS)
WorkManager.getInstance().enqueue(firstWorkRequest)
,具有所需的时间。
答案 1 :(得分:0)
您尝试在WorkManager中使用链接的任务。首先安排 OneTimeWorkRequest ,然后将其与 PeriodicWorkRequest 链接。喜欢:
WorkManager.getInstance()
.beginWith(workA)
.then(workB)
其中 workA 是 OneTimeWorkRequest ,而 workB 是 PeriodicWorkRequest
答案 2 :(得分:0)
新的PeriodicWorkRequests现在支持初始延迟。因此,您从用户那里获得了所需的时间,计算出userTime和Now之间的时差,然后设置延迟。 与AlarmManeger不同,它非常可靠。 唯一的问题是Android在找到最佳时机时解雇了Worker(没有其他工作要做),因此它的启动可能会稍有延迟(通常不超过几分钟)。