6

我正在努力使我的闹钟应用程序与即将发布的 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" />
4

1 回答 1

-2

您应该在 Android 12 中执行以下操作:

为鼓励应用节省系统资源,Android 12 要求“警报和提醒”特殊应用访问以 Android 12 为目标且设置确切警报的应用。

另请查看 Android 12 中的这个新概念:

您还可以在 ACTION_BOOT_COMPLETED 广播接收器中添加重新调度逻辑,当您的应用程序离开休眠状态和设备启动后调用该接收器。

于 2021-09-24T22:13:34.303 回答