AndroidX WorkManager - "how to" 使计划作业持久化?
AndroidX WorkManager - "how to" make a scheduled job persistent?
我遵循了 google 代码实验室中关于实施 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)
标志来实现。
我查看了文档,但没有提到 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());
}
文档中没有指定如何配置它以应对此类情况。
由于 WorkManagerImpl
构造函数使用 Context
这(可能)意味着如果您的应用程序具有 RECEIVE_BOOT_COMPLETED
的权限,则 WorkManager
将接收此事件并重新安排所有尚未收到的工作请求已在您在 Work.Builder
中指定的给定 window 内执行。
我遵循了 google 代码实验室中关于实施 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)
标志来实现。
我查看了文档,但没有提到 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());
}
文档中没有指定如何配置它以应对此类情况。
由于 WorkManagerImpl
构造函数使用 Context
这(可能)意味着如果您的应用程序具有 RECEIVE_BOOT_COMPLETED
的权限,则 WorkManager
将接收此事件并重新安排所有尚未收到的工作请求已在您在 Work.Builder
中指定的给定 window 内执行。