Действительно, WorkManager - это путь.
Вы можете прочитать больше о других рабочих примитивах, чтобы удовлетворить вашей задаче здесь , но нижеприведенная реализация использует Worker для работы с потоками в WorkManager, который синхронно выполняет работу в фоновом потоке.
public class BackgroundWorker extends Worker {
public BackgroundWorker
(@NonNull Context context,
@NonNull WorkerParameters params) {
super(context, params);
}
@NonNull
@Override
public Worker.Result doWork() {
yourBackgroundTask(); // yourBackgroundTask() implementation
return Result.success();
}
public static void schedulePeriodicWork(Data data) {
// When multiple constraints are specified like below,
// your task will run only when all the constraints are met.
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.setRequiresCharging(true)
.build();
PeriodicWorkRequest taskWork = new PeriodicWorkRequest.Builder(BackgroundWorker.class, 60,
TimeUnit.MINUTES)
.setConstraints(constraints)
.setInputData(data)
.build();
WorkManager.getInstance().enqueue(taskWork);
}
}
Позже в вашем файле MainActivity, внутри onCreate()
:
Data data = workData();
BackgroundWorker.schedulePeriodicWork(data);
Тогда вне метода onCreate()
,
private Data workData() {
return new Data.Builder() // to build Data objects
.build();
}
Одна небольшая вещь, на которую следует обратить внимание, это то, что, хотя мы устанавливаем вышеупомянутую задачу для выполнения каждые 60 минут, каждая итерация может не выполняться за один и тот же промежуток времени.
Согласно документации Android, WorkManager предназначен для отложенной работы, и некоторые отклонения должны быть допустимы. Однако вы можете проверить консоль журнала на наличие обновлений "WM-WorkerWrapper: Worker result SUCCESS for Work
".
Надеюсь, это полезно.