我有一个应用程序小部件,我希望在一行文字“x minutes ago”中保持最新信息,指的是它下方位图的年龄。我编写的代码如下:
private fun scheduleUpdateAge(context: Context) {
val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val resultCode = jobScheduler.schedule(
JobInfo.Builder(UPDATE_AGE_JOB_ID, ComponentName(context, UpdateAgeService::class.java))
.setMinimumLatency(MINUTE_IN_MILLIS)
.setOverrideDeadline(2 * MINUTE_IN_MILLIS)
.build())
reportScheduleResult("update age", MINUTE_IN_MILLIS, resultCode)
}
在最后一行,我检查调度结果,它总是成功的。
在作业服务中,我更新远程视图,然后重新安排作业:
class UpdateAgeService : JobService() {
override fun onStartJob(params: JobParameters): Boolean {
MyLog.i("UpdateAgeService start job")
updateRemoteViews(applicationContext)
jobFinished(params, false)
scheduleUpdateAge(applicationContext)
return false
}
override fun onStopJob(params: JobParameters): Boolean {
MyLog.i("UpdateAgeService stop job")
return true
}
}
但是,我一直观察到Android在很长一段时间内都没有调用我的工作,超过十分钟。那时,另一个计划的作业,即刷新位图的作业,也会启动并重置年龄文本。
setOverrideDeadline
州的文件
设置截止日期,即最大调度延迟。即使没有满足其他要求,这项工作也将在此截止日期前完成。
但Android似乎违反了它。
我在这里错过了什么吗?
我知道安排定期工作的“自然”方式是setPeriodic()
,但setPeriodic()
也未调用我的工作,其合同明确说明
您无法控制何时在此时间间隔内执行此作业,只能保证在此时间间隔内最多执行一次。
对于那种情况,错过了时间表是“按书”。