#android #android-jobscheduler #android-12
Вопрос:
Я работаю над тем, чтобы мое приложение для будильника было совместимо с Android 12, который скоро выйдет, и недавно я наткнулся на проблему. Похоже, что после обновления Android 12 задания, запланированные в планировщике заданий во время заблокированной/прямой загрузки, не запускаются до тех пор, пока устройство не будет разблокировано. Я рассмотрел изменения, внесенные в 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" />
Комментарии:
1. Насколько я помню, вам не нужно перепланировать какие-либо задания при перезагрузке, вы уверены, что старые задания не выполняются после перезагрузки? или вы действительно что-то загружаете
2. Какую бета-версию вы используете? и какова модель устройства, которое вы тестируете?
3. @MarcosVasconcelos Сохраненные задания действительно не нуждаются в переносе, но в моем случае это одноразовое задание, которое необходимо выполнить почти немедленно, так как я не могу предвидеть, когда пользователь перезагрузит устройство. Следовательно, планирование запусков аварийных сигналов при загрузке.
4. @Jabbar Я использую Pixel 3 с новейшей бета-версией, доступной в настоящее время: SPB5.210812.002. Почему вы спрашиваете об этом — проблемы не существует на вашем тестирующем устройстве?
5. @Koger просто спрашивает, потому что они все еще исправляют проблемы, многие исправленные проблемы связаны с загрузкой системы, поэтому я подумал, что это уже может быть исправлено.
Ответ №1:
в Android 12 вы должны сделать следующее:
Чтобы побудить приложения экономить системные ресурсы, Android 12 требует доступа к специальному приложению «Сигналы тревоги и напоминания» для приложений, предназначенных для Android 12, которые устанавливают точные сигналы тревоги.
Также, пожалуйста, ознакомьтесь с этой новой концепцией в Android 12:
Вы также можете добавить логику переноса в широковещательный приемник ACTION_BOOT_COMPLETED, который вызывается, когда ваше приложение выходит из режима гибернации и после загрузки устройства.
Комментарии:
1. Но я не ставлю точный будильник — я планирую работу для JobScheduler. Это две разные вещи. ACTION_BOOT_COMPLETED известен с API 1 и здесь не имеет значения, так как он транслируется после разблокировки устройства, в то время как проблема возникает только при заблокированной/прямой загрузке.
2. Я думал, это приложение для сигнализации! Также я указывал на проблему с гибернацией, которая может вызвать ваши проблемы.