AndroidX WorkManager - "如何"使预定的工作持久?

时间:2018-05-24 13:23:59

标签: android android-jobscheduler

我遵循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)标记来执行此操作。

1 个答案:

答案 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中指定的给定窗口内执行。