Potrzebuję w aplikacji wysyłać co godzinę notyfikacje. W tym celu wykorzystuję AlarmManager
oraz BroadcastReceiver
.
O ile na Android 9 wszystko działa poprawnie (tj. notyfikacje przychodzą co godzinę, ewentualnie jedna godzina "gubi się"), tak na Android 11 nie działa to kompletnie.
Wygląda tak, jakby w momencie wyjścia z aplikacji AlarmManager
przestawał działać. Natomiast kiedy po jakimś czasie wejdę ponownie do aplikacji dostaję natychmiast zaległe powiadomienie. Czy ktoś ma pomysł co powinienem zmodyfikować? Poniżej kod.
AlarmManager
(uruchamiany jest wewnątrz Activity
)
val intent = Intent(context, AlarmReceiver::class.java).apply {
action = context.getString(R.string.alarm_pending_action)
}
val alarmIntent = PendingIntent.getBroadcast(context, ALARM_REQUEST_CODE, intent, FLAG_UPDATE_CURRENT)
val datetimeToAlarm = Calendar.getInstance()
.apply {
timeInMillis = System.currentTimeMillis()
add(Calendar.HOUR_OF_DAY, 1)
set(Calendar.MINUTE, 0)
}
alarmManager.setAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
datetimeToAlarm.timeInMillis,
alarmIntent
)
AlarmReceiver
private var receivedIntent: Intent? = null
override fun onReceive(context: Context, intent: Intent) {
if (intent.action != null) {
if (intent.action!!.equals(context.getString(R.string.alarm_pending_action), ignoreCase = true)) {
receivedIntent = intent
createNewAlarm(context)
NotificationHelper.createNotification(context)
}
}
}
private fun createNewAlarm(context: Context) {
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val alarmIntent = createPendingIntent(context)
scheduleAlarm(alarmIntent, alarmManager)
}
private fun scheduleAlarm(
alarmIntent: PendingIntent,
alarmManager: AlarmManager
) {
val datetimeToAlarm = Calendar.getInstance()
.apply {
timeInMillis = System.currentTimeMillis()
add(Calendar.HOUR_OF_DAY, 1)
set(Calendar.MINUTE, 0)
}
alarmManager.setAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
datetimeToAlarm.timeInMillis,
alarmIntent
)
}
private fun createPendingIntent(context: Context): PendingIntent {
return PendingIntent.getBroadcast(context, ALARM_REQUEST_CODE, receivedIntent!!, PendingIntent.FLAG_CANCEL_CURRENT)
}
AndroidManifest
<receiver
android:name=".alert.AlarmReceiver"
android:process=":remote" />
Siedzę już 3 dzień i bije głową w mur, więc dzięki za każdą pomoc :)