Search code examples
androidalarmmanager

Why is my Android AlarmManager code not working properly?


I have an alarm in my app:

public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.curentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 11);
        calendar.set(MINUTE, 11);

        Intent intent = new Intent(this, AlarmReceiver.class);
        PendingIntent pendingIntent = Pending.getBroadcast(this, 0, intent, 0);

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntente);
    }
}

This is my AlarmReceiver.class

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent){
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        System.out.println("ALARM: " + sdf.format(new Date()));
    }
}

And in my AndroidManifest.xml I have this line

<receiver android:name=".main.AlarmReceiver" />

The issue is that the alarm does not alarm for the time I set. I set the alarm for

calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 5);

Then the alarm alarmed at 11:11:29. Then I set the alarm for

calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 20);

Then the alarm alarmed at 11:26:29. Then I set the alarm for

calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 29);

Then the alarm alarmed at 11:41:29.

It continued this way all morning. However, if I replace this line

alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntente);

with this line

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, (SystemClock.elapsedRealtime()+10000), pendingIntent);

Then the alarm alarms perfectly in the appropriate 10 seconds.

What is going on?


Solution

  • As per the documentation, setInexactRepeating is not accurate by design. In order to reduce the battery drain by waking up the device too many times, it internally tries to fire several alarms at the same time resulting in inexact alarm time for some of the clients. https://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int,%20long,%20long,%20android.app.PendingIntent)