Я реализовал некоторую повторяющуюся задачу, используя WorkManager
, и она прекрасно работает (запускает мой код каждый период с несколькими минутами раньше или позже) в дневное время, когда я активно использую свой телефон. В ночное время он пропускает много периодов, и мне интересно, почему это происходит и как это решить.
fun startService() {
val constraintsBuilder = Constraints.Builder()
constraintsBuilder.setRequiredNetworkType(NetworkType.CONNECTED)
val constraints = constraintsBuilder.build()
val work = PeriodicWorkRequest.Builder(
HttpWorker::class.java,
40, TimeUnit.MINUTES,
15, TimeUnit.MINUTES
).setConstraints(constraints)
.addTag("TAG_WORKER")
.build()
WorkManager.getInstance().enqueueUniquePeriodicWork(
HttpWorker::class.java.simpleName,
ExistingPeriodicWorkPolicy.REPLACE,
work
)
}
Результат выглядит так:
---> run09: 14
---> прогон 09:54 (40 мин)
---> прогон 10:33 (39 мин)
---> прогон 11:53 (80 минут)
---> пробег 12:33 (39 минут)
...
---> пробег 00:35
---> прогон 01:20 (45 мин)
---> прогон 03:39 (139 мин) !!!
---> прогон 07:14 (215 мин) !!!
---> пробежка 07:47 (30 мин)
---> пробежка 08:26 (39 мин)
...
Определенно это связано с активностью устройства, также обратите внимание, что я отключил энергосбережение для своего приложения (мое устройство - новая модель Samsung Galaxy от 2018 Android 9.0). Что я должен сделать, чтобы игнорировать эти многочисленные пропущенные периоды в ночное время (когда устройство вообще не используется).
ps мое приложение отсутствует в Google Play, так что никаких проблем с взломами нет (но безкорень)