我遵循googles codelabs关于WorkManager实施和工作安排的指导原则。
PeriodicWorkRequest workRequest =
new PeriodicWorkRequest.Builder(Is30DaysOldWorker.class, PERIODIC_WORKREQUEST_INTERVAL, TimeUnit.SECONDS)
.addTag(IS_30_DAYS_OLD_WORKER)
.build();
getWorkManager().enqueue(workRequest);
来自Google docs WorkManager
使用JobScheduler
获取API 23+(我的情况) - 所以是否可以在设备重启后使预定作业持续存在?
在JobScheduler
方案中,您通常会通过指定JobInfo.setPersisted(true)
标记来执行此操作。
答案 0 :(得分:8)
我查看了文档,但未提及WorkManager
将处理持久性WorkRequests
,但正如您所说JobInfo
已经拥有该标记。
但是在源代码中有一个名为rescheduleEligibleWork()
的方法,它会在启动或类似情况下重新安排所有作业。它将工作请求存储在自己的房间数据库中。
/**
* Reschedules all the eligible work. Useful for cases like, app was force stopped or
* BOOT_COMPLETED, TIMEZONE_CHANGED and TIME_SET for AlarmManager.
*
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public void rescheduleEligibleWork() {
// Reset scheduled state.
getWorkDatabase().workSpecDao().resetScheduledState();
// Delegate to the WorkManager's schedulers.
// Using getters here so we can use from a mocked instance
// of WorkManagerImpl.
Schedulers.schedule(getWorkDatabase(), getSchedulers());
}
没有办法指定如何配置它来处理doc中的此类情况。
由于WorkManagerImpl
构造函数使用Context
(可能)意味着如果您的应用程序具有RECEIVE_BOOT_COMPLETED
的权限,WorkManager
将收到此事件并重新安排所有尚未执行的工作请求已在Work.Builder
中指定的给定窗口内执行。