我正在努力使我的闹钟应用程序与即将发布的 Android 12 兼容,最近我偶然发现了一个问题。似乎自 Android 12 更新以来,在锁定/直接启动期间在 Job Scheduler 中安排的作业直到设备解锁后才会启动。我已经查看了在 Android 12 中所做的更改,但没有发现任何适用于我的情况的更改,我在随机测试中发现了这一点。
这是一个主要问题,因为我需要在设备重启时重新安排我的应用程序的警报,并且不能等待用户首先解锁设备,因为重启可能会在一夜之间自动发生,让用户在早上没有预定的警报。
在测试应用程序(针对 Android 11)下运行时,结果如下:
- Android 11 及更低版本:在锁定和常规启动期间计划并立即启动作业。
- Android 12:在正常启动期间如上工作,但在锁定启动时立即安排工作,但仅在设备解锁后启动。
除了手动运行整个作业(例如使用 WakeLock)之外,关于如何使用它的任何建议?或者也许有人知道 Android 12 的哪些变化实际上在这里生效?
这是一个用于观察这种情况的简单测试类:
class TestScheduler : JobService() {
companion object {
fun addScheduledJob(context: Context){
JobInfo.Builder(1111, ComponentName(context, TestScheduler::class.java))
.setOverrideDeadline(TimeUnit.SECONDS.toMillis(1))
.build().let {
val result = (context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler).schedule(it)
when(result){
JobScheduler.RESULT_SUCCESS -> "success"
else -> "failure"
}.also {
Log.d("MyTAG", "jobScheduled: $it")
}
}
}
}
override fun onStartJob(params: JobParameters?): Boolean {
Log.d("MyTAG", "onStartJob: ${params?.jobId}")
jobFinished(params, false)
return true
}
override fun onStopJob(params: JobParameters?): Boolean {
Log.d("MyTAG", "onStopJob: ${params?.jobId}")
return true
}
}
作业是从引导接收器安排的:
class OnBootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
TestScheduler.addScheduleJob(context)
}
}
这两个类都是directBootAware(清单的内容):
<receiver
android:name=".OnBootReceiver"
android:directBootAware="true"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name=".TestScheduler"
android:directBootAware="true"
android:permission="android.permission.BIND_JOB_SERVICE" />