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 内执行。