AndroidX WorkManager - «как» сделать запланированное задание постоянным? - PullRequest
0 голосов
/ 24 мая 2018

Я следовал инструкциям из кодовых таблиц 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 документы WorkManager использует JobScheduler для API 23+ (в моем случае) - можно ли сделать запланированное задание постоянным после перезагрузки устройства?

В сценарии JobScheduler вы обычно делаете это, указывая флаг JobInfo.setPersisted(true).

1 Ответ

0 голосов
/ 24 мая 2018

Я просмотрел документацию, там не упоминалось, что 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.

...