JobService不会在android 9中重新安排

问题描述 投票:3回答:1

我正在尝试让我的应用程序在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 9的Android Studio模拟器。据我测试,它不适用于运行Android 9的任何物理设备。

android kotlin job-scheduling android-9.0-pie jobservice
1个回答
1
投票

如果你通过THE LINK,你会发现:

不幸的是,一些设备实现了从最近的菜单中杀死应用程序作为强制停止。股票Android不会这样做。当一个应用程序被强制停止时,它无法执行作业,接收警报或广播等。所以不幸的是,我们解决它是不可行的 - 问题在于操作系统并且没有解决方法。

这是一个众所周知的问题。为了节省电池,许多制造商强制关闭应用程序,从而取消所有期间任务,警报和广播接收器等。主要制造商是OnePlus(您可以选择toogle),Redmi,Vivo,Oppo,Huwaei。

UPDATE

这些设备中的每一个都具有AutoStartManagers / AutoLaunch / StartManager类型的优化管理器。这会阻止后台活动重新开始。您必须手动要求用户将您的应用程序列入白名单,以便该应用程序可以自动启动其后台处理。关注THISTHIS链接,了解更多信息。

添加到不同制造商的白名单的方法在this stackoverflow answer中给出。即使添加到白名单后,由于DOZE模式,您的应用可能无法正常工作,因为您必须使用ignore battery otimizations

如果您可能想知道,Gmail / Hangout / WhatsApp / Slack / LinkedIn等应用程序已经被这些AutoStart Manager列入白名单。因此,对他们的背景过程没有影响。您始终可以及时收到更新和通知。

© www.soinside.com 2019 - 2024. All rights reserved.