6

我正在尝试让我的应用程序在 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 的任何物理设备。

4

1 回答 1

8

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

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

这是一个已知问题。很多厂商为了省电,强行关闭应用,取消所有的经期任务、闹钟和广播接收器等。主要的厂商是一加(您可以选择切换)、Redmi、Vivo、Oppo、华为。

更新

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

此 stackoverflow 答案中给出了为不同制造商添加到白名单的方法。即使添加到白名单后,您的应用程序也可能由于打盹模式而无法运行,因为您将不得不忽略电池优化

此外,如果您想知道,Gmail/Hangout/WhatsApp/Slack/LinkedIn 等应用程序已经被这些 AutoStart 管理器列入白名单。因此,对其后台进程没有影响。您总是会收到及时的更新和通知。

于 2019-01-23T11:49:04.267 回答