Моя цель - запускать простую задачу раз в час. При запуске приложения я регистрирую уникальный период c работа с флагом ExistingPeriodicWorkPolicy.KEEP
.
Вот моя реализация:
public class MyWorker extends Worker {
public MyWorker(Context context, WorkerParameters workerParams) {
super(context, workerParams);
// I don't do anyting with workerParams
}
public static void enqueueWork() {
Constraints constraints = new Constraints.Builder()
.setRequiresBatteryNotLow(true)
.build();
PeriodicWorkRequest request = new PeriodicWorkRequest
.Builder(MyWorker.class, 1, TimeUnit.HOURS)
.setConstraints(constraints)
.addTag("MyWorkerWork")
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("MyWorkerWork",
ExistingPeriodicWorkPolicy.KEEP, request);
}
@NonNull
@Override
public Result doWork() {
Log.i(TAG, "doWork");
return Result.success();
}
}
Единственное место, где я звоню enqueueWork()
, это Application#onCreate
.
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
MyWorker.enqueueWork();
}
}
Вышеуказанная настройка работает нормально. Одна из проблем заключается в том, что иногда doWork
вызывается дважды подряд с ~ 30 сек c времени между ними. Это не воспроизводится на 100%, но я вижу это часто, когда я оставляю телефон на ночь, возвращаюсь на следующий день и включаю дисплей телефона в первый раз.
Типичный журнал будет выглядеть так:
01-13 13:29:04.601 19018 19449 I/MyApp: doWork
01-13 13:29:04.700 19018 19124 I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=37064d6c-297b-4c0d-9fd7-xxxxxxxxxxxx, tags={ com.xxx.MyWorker, MyWorkerWork } ]
01-13 13:29:42.203 19018 19482 I/MyApp: doWork
01-13 13:29:42.292 19018 19145 I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=37064d6c-297b-4c0d-9fd7-xxxxxxxxxxxx, tags={ com.xxx.MyWorker, MyWorkerWork } ]
Интересно то, что это происходит БЕЗ процесса. Если вы испытали это раньше, пожалуйста, помогите.