Запланируйте работу на определенное время с WorkManager

WorkManager-это библиотека, используемая для запроса работы, которая гарантированно выполняется после выполнения ее ограничений.

следовательно, пройдя через ограничения class я не нашел никакой функции для добавления ограничения по времени на работу. Например, я хочу начать работу для выполнения в 8: 00 (работа может быть любого из двух типов OneTimeWorkRequest или PeriodicWorkRequest) утром. Как добавить ограничение запланировать эту работу с WorkManager.

2 ответов


к сожалению, вы не можете запланировать работу в определенное время, как сейчас. Если у вас есть критическая реализация времени, вы должны использовать AlarmManager для установки тревоги, которая может срабатывать во время дремоты, используя setAndAllowWhileIdle () или setExactAndAllowWhileIdle ().

вы можете запланировать работу с временной начальной задержкой или выполнять ее периодически, используя WorkManager следующим образом:

Создать Рабочий класс:

public class MyWorker extends Worker {
    @Override
    public Worker.WorkerResult doWork() {

        // Do the work here

        // Indicate success or failure with your return value:
        return WorkerResult.SUCCESS;

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to try again.)
    }
}

затем расписание OneTimeWorkRequest следующим образом:

OneTimeWorkRequest mywork=
        new OneTimeWorkRequest.Builder(MyWorker.class)
        .setInitialDelay(<duration>, <TimeUnit>)// Use this when you want to add initial delay or schedule initial work to `OneTimeWorkRequest` e.g. setInitialDelay(2, TimeUnit.HOURS)
        .build();
WorkManager.getInstance().enqueue(mywork);

вы можете установить дополнительные ограничения следующим образом:

// Create a Constraints that defines when the task should run
Constraints myConstraints = new Constraints.Builder()
    .setRequiresDeviceIdle(true)
    .setRequiresCharging(true)
    // Many other constraints are available, see the
    // Constraints.Builder reference
     .build();

затем создайте OneTimeWorkRequest, который использует эти ограничения

OneTimeWorkRequest mywork=
                new OneTimeWorkRequest.Builder(MyWorker.class)
     .setConstraints(myConstraints)
     .build();
WorkManager.getInstance().enqueue(mywork);

PeriodicWorkRequest можно создать следующим образом:

 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, 12, TimeUnit.HOURS)
                                   .build();
  WorkManager.getInstance().enqueue(periodicWork);

это создает PeriodicWorkRequest для периодического запуска каждые 12 часов.


до сих пор невозможно достичь точного времени с помощью PeriodicWorkRequest.
Уродливая работа вокруг будет использовать OneTimeWorkRequest и когда он срабатывает, установите другой OneTimeWorkRequest С новым расчетным периодом и так далее.