Android 11 AlarmManager przestaje działać

0

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 :)

1

nie ogarniesz tego. I tak masz fart że na 9 Ci działa, chociaż też nie jestem o tym przekonany. Poczytaj o doze mode
https://developer.android.com/training/monitoring-device-state/doze-standby

Niestety cudów bym się nie spodziewał. Jeżeli faktycznie chcesz mieć co godzinę, i być pewnym ze wystartuje , to zrób setAlarmClock, nic innego nie masz gwarancji że będzie się uruchamiało

1

Generalnie niestety poleganie na czymkolwiek co ma byc odpalane w tle nie ma sensu. A o konkretnych godzinach to już w ogole:

https://dontkillmyapp.com/

Na Redicie czytam że ludzie specjalnie dodaja do nazwy pakietu słowko "alarm" żeby Szajsungi i inne wynalazki myslaly ze to apka zegar/alarm clock i nie ubijały jej od razu - lol.

1 użytkowników online, w tym zalogowanych: 0, gości: 1