В моем приложении реализована уникальная периодическая c работа с API WorkManager. Работа должна каждые 30 минут проверять онлайн-ресурс и показывать уведомление, если есть непрочитанные уведомления. Да, мне нужна работа periodi c, потому что ресурс является сервером IMAP, и поэтому я не могу использовать уведомления FCM. Однако задание правильно запланировано, как я вижу с помощью dumpsys jobscheduler
, но через некоторое время задание прекратилось. Когда я запускаю dumpsys jobscheduler
, я читаю что-то вроде этого:
JOB #u0a360/7: aa1b828 com.mypackage.app/androidx.work.impl.background.systemjob.SystemJobService
u0a360 tag=*job*/com.mypackage.app/androidx.work.impl.background.systemjob.SystemJobService
Source: uid=u0a360 user=0 pkg=com.mypackage.app
JobInfo:
Service: com.mypackage.app/androidx.work.impl.background.systemjob.SystemJobService
Requires: charging=false batteryNotLow=false deviceIdle=false
Extras: mParcelledData.dataSize=180
Minimum latency: +29m59s973ms
Backoff: policy=1 initial=+30s0ms
Has early constraint
Required constraints: TIMING_DELAY [0x80000000]
Satisfied constraints: TIMING_DELAY DEVICE_NOT_DOZING BACKGROUND_NOT_RESTRICTED [0x82400000]
Unsatisfied constraints: WITHIN_QUOTA [0x1000000]
Tracking: TIME QUOTA
Implicit constraints:
readyNotDozing: true
readyNotRestrictedInBg: true
Standby bucket: FREQUENT
Base heartbeat: 0
Deferred since: -1h47m30s949ms
Enqueue time: -1h48m0s986ms
Run time: earliest=-1h18m1s13ms, latest=none, original latest=none
Last run heartbeat: 0
Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)
Это проблема Unsatisfied constraints: WITHIN_QUOTA [0x1000000]
, но, к сожалению, я не смог найти документацию для ошибок такого рода. Официальный от Google довольно расплывчатый: https://developer.android.com/topic/libraries/architecture/workmanager/how-to/debugging
Вот как я планирую работу:
if (PreferenceController.getInstance().getEmailNotificationInerval() != -1) {
int interval = PreferenceController.getInstance().getEmailNotificationInerval();
Constraints constraints = new Constraints.Builder().build();
PeriodicWorkRequest emailsRequest = new PeriodicWorkRequest.Builder(CheckNewEmailWorker.class, interval, TimeUnit.SECONDS)
.setConstraints(constraints)
.build();
WorkManager.getInstance(context).enqueueUniquePeriodicWork(CheckNewEmailWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, emailsRequest);
}
И я использую BOOT_COMPLETED
приемник для запустите его при загрузке.
В рабочем я возвращаю Result.success()
, если все идет хорошо, и Result.failure()
, если возникает исключение (например, нет соединения).