К сожалению, вы не можете запланировать работу в определенное время на данный момент. Если у вас есть критическая по времени реализация, вы должны использовать AlarmManager для установки будильника, который может срабатывать в режиме Doze, с помощью 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 часов.