JobService не перенесен в Android 9 - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь заставить мое приложение работать на Android 9. Следующий код прекрасно работает до Android 8, но по какой-то причине JobService не переназначается на Android 9. Он запланирован в первый раз, но не получить перенесено в соответствии с установленным периодическим.

class RetrieveJobService : JobService() {

override fun onStartJob(params: JobParameters): Boolean {
    doBackgroundWork(params)
    return true
}

private fun doBackgroundWork(params: JobParameters) {
    Thread {
        try {
            doRetrieveBackgroundStuff(this)
            jobFinished(params, false)
        } catch (e: Exception) {
            jobFinished(params, false)
        }
    }.start()
}

override fun onStopJob(params: JobParameters): Boolean {
    return false
}

}

А вот и мой JobInfo.Builder

val builder = JobInfo.Builder(jobID, componentName)
                    .setPersisted(true)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    builder.setPeriodic(millis, 15 * 60 * 1000) //15 min
} else {
    builder.setPeriodic(millis)
}
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)

val scheduler = context.getSystemService(JOB_SCHEDULER_SERVICE) as 
        JobScheduler
val resultCode = scheduler.schedule(builder.build())

Есть идеи? РЕДАКТИРОВАТЬ: Просто чтобы прояснить, этот код отлично работал на Android 8 и ниже, а также работает на эмуляторе Android Studio под управлением Android 9. Насколько я могу проверить, он не работает на любом физическом устройстве под управлением Android 9.

1 Ответ

0 голосов
/ 23 января 2019

Если вы пройдете через ССЫЛКА , вы найдете:

К сожалению, некоторые устройства осуществляют принудительное отключение приложения из меню «последние». Сток Android не делает этого. Когда приложение принудительно останавливается, оно не может выполнять задания, получать сигналы тревоги или широковещательные сообщения и т. Д. Поэтому, к сожалению, мы не можем решить эту проблему - проблема заключается в ОС, а обходного пути нет.

Это известная проблема. Чтобы сэкономить заряд батареи, многие производители принудительно закрывают приложение, отменяя, таким образом, все задачи периода, аварийные сигналы, радиовещательные приемники и т. Д. Основными производителями являются OnePlus (у вас есть возможность переключения), Redmi, Vivo, Oppo, Huwaei.

UPDATE

У каждого из этих устройств есть менеджеры оптимизации типа AutoStartManager / AutoLaunch / StartManager. Которые мешают фоновым действиям начинать заново. Вам нужно будет вручную попросить пользователя внести в белый список ваше приложение, чтобы приложение могло автоматически запускать свои фоновые процессы. Для получения дополнительной информации перейдите по ссылке ЭТО и ЭТО .

Методы добавления в белый список для разных производителей приведены в ответ на этот стекопоток . Даже после добавления в белый список ваше приложение может не работать из-за режима DOZE, для этого вам придется игнорировать раздражения батареи

Также, если вам может быть интересно, такие приложения, как Gmail / Hangout / WhatsApp / Slack / LinkedIn и т. Д., Уже занесены в белый список этими менеджерами автозапуска. Следовательно, нет никакого влияния на их фоновые процессы. Вы всегда получаете своевременные обновления и уведомления.

...