JobService 不会在 android 9 中重新安排

Posted

技术标签:

【中文标题】JobService 不会在 android 9 中重新安排【英文标题】:JobService does not get rescheduled in android 9 【发布时间】:2019-01-21 17:37:02 【问题描述】:

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

【问题讨论】:

当您关闭应用程序或从不工作时它是否不起作用。还有设备制造商名称是什么? 关闭应用程序时它永远不会工作,我已经看到它在指定的周期性时间间隔后打开应用程序时工作但它不一致。设备:华为 P20、一加 6T。模拟器:Nexus 5X 许多设备制造商,如 OnePlus、Oppo、Huwaei、Redmi、Vivo 等,在从最近的标签中清除应用程序时会强制关闭应用程序。因此,没有计划任务或警报管理器适用于该应用程序。 issuetracker.google.com/issues/110745313 【参考方案1】:

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

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

这是一个已知问题。很多厂商为了省电,强行关闭应用,取消所有的经期任务、闹钟、广播接收等。主要厂商有一加、红米、vivo、OPPO、华为。

更新

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

不同厂家添加白名单的方法在this *** answer中给出。即使添加到白名单后,您的应用也可能由于打盹模式而无法运行,为此您必须ignore battery otimizations

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

【讨论】:

感谢您的回复!我想知道我应该如何实现我的应用程序。提供更多上下文。我正在开发一个墙纸应用程序,它每隔几个小时就会自动设置一张新墙纸。我认为 JobService 是用于这些任务的正确工具。 如果您有任何其他疑问,请随时提问。 只想回应@LinusNox;一年后,我在 JobScheduler 上遇到了类似的问题。有人应该告诉谷歌,从开发人员的角度来看,被告知我们现在应该开始使用 JobScheduler 是非常令人沮丧的,结果却发现它已被锁定到几乎无法使用的地步(除非你碰巧是谷歌或 Facebook 并且被预先列入白名单)。我理解想要保持电池寿命,但这太荒谬了。 /咆哮

以上是关于JobService 不会在 android 9 中重新安排的主要内容,如果未能解决你的问题,请参考以下文章

Android学习使用JobService

Android JobService的使用及源码分析

Android--使用JobService实现进程保活

在firebase jobdispatcher中停止JobService内的计划作业

JobService 的 onStartJob 方法在作业被调度后立即执行

在 Android 中不需要 android.permission.BIND_JOB_SERVICE 权限