Это равно , поскольку вы используете OnTimeWorkRequest
, из его названия вы можете сделать вывод, что запрос действителен только один раз.После запуска он не будет вызываться снова, если только вы не запустите его снова.Проблема в том, что WorkManager
не поддерживает другие запросы или ограничения, которые соответствуют вашим потребностям.Посмотрите на этот вопрос .
Если вы действительно хотите использовать этот паттерн WorkManger
и Requests
, я могу дать вам идею, основанную на том факте, что людикак правило, каждый раз заряжайте телефон дольше нескольких минут.
Вы можете использовать 2 типа WorkRequests
вместе взятых:
OneTimeWorkRequest
, что является фактическимлогика вашего алгоритма.Установите ограничения, чтобы быть только во время зарядки.После запуска этот работник помещает в очередь PeriodicWorkRequest
без каких-либо ограничений и «Минимальный интервал повторения, который можно определить, составляет 15 минут»
PeriodicWorkRequest
, которыйэто будет срабатывать каждые 15 минут и периодически проверять, заряжается ли телефон.Когда работник в первый раз обнаруживает, что устройство отключено от сети, он ставит в очередь OneTimeWorkRequest
сверху и отменяет сам себя.
Таким образом, вы не обнаружите быстрых изменений состояния питания устройства,но это лучший вариант в Android Oreo (и выше), поскольку приложения , предназначенные для уровня API 26 или выше, больше не могут регистрировать приемники широковещания для неявных трансляций в своем манифесте
Чтобы проверить,устройство подключено или нет:
Вы даже можете определить, какая это зарядка, используйте этот код:
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
взято прямо из руководства разработчика Android
Чтобы отменить WorkRequest
:
Сначала создайте его с помощью tag
:
OneTimeWorkRequest.Builder(MyWorker.class)
.setConstraints(myConstraints)
.addTag(tag)
.build();
, а затем выполните WorkManager.getInstance().cancelAllWorkByTag(tag)
Другой вариантпоставить в очередь уникальную работу:
WorkManager.getInstance().enqueueUniquePeriodicWork(
uniqueWorkName, ExistingPeriodicWorkPolicy.REPLACE, periodicWork);
и затем отменить ее с WorkManager.getInstance().cancelUniqueWork(workName)