I am trying to make an alarm fire in my app every 30 minutes using Alarm Manager's setExactAndAllowWhileIdle
but it is not working!
I test the functionality by issuing a push notification whenever I receive an alarm signal.
The problem is: when the device enters doze mode after being idle for sometime, I no longer receive alarms. However, as soon as I turn On the screen, I receive a notification. My app needs accurate alarms that need to be delivered exactly on-time every 30 minutes! It can not afford to receive delayed alarms or dropped ones because the device is in Doze mode!
I used the following in my code:
onReceive()
method I set the next alarm. I also, start a
startWakefulService that only issues a push notification, then stops
itself.Notes:
android.permission.WAKE_LOCK
setAlarmClock()
which worked all the time even during doze
mode, with one dropped/delayed alarm every 50 alarms. So, it is also not
perfect. And I don't want the user to see an alarm icon all the time up
there.P.S: Before answering please make sure you are aware of the restrictions imposed starting Android 6.0 M and Doze mode.
Link1: https://developer.android.com/training/monitoring-device-state/doze-standby.html
In summary it says this:
Now, why don't I get accurate alarm signals every 30 minutes using setExactAndAllowWhileIdle()
?!
And, why isn't setAlarmClock()
100% reliable?!
This example demonstrates how do I implement alarm manager in android. Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml.
In order to delete : AlarmManager alarmManager = (AlarmManager) getSystemService(Context. ALARM_SERVICE); Intent myIntent = new Intent(getApplicationContext(), SessionReceiver. class); PendingIntent pendingIntent = PendingIntent.
You can cancel the alarm like this: Intent intent = new Intent(this, Mote. class); PendingIntent pendingIntent = PendingIntent. getBroadcast(getApplicationContext(), 1253, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.
Alarms in Android have the following characteristics: Alarms let you send intents at set times or intervals. You can use alarms with broadcast receivers to start services and perform other operations.
You might get accurate alarms, but in Doze mode
The system ignores wake locks.
So it seems as though AlarmManager.setAlarmClock
is the only acceptable solution if you really need to trigger every 30 minutes. This will probably negate all doze mode energy savings...
BTW: it seems like you can see alarms with adb shell dumpsys alarm
.
Possibility: use Firebase JobDispatcher
The Firebase JobDispatcher is a library for scheduling background jobs in your Android app. It provides a JobScheduler-compatible API that works on all recent versions of Android (API level 14+) that have Google Play services installed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With