Запланируйте работу на определенное время с 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
С новым расчетным периодом и так далее.