user6484270
user6484270

Reputation:

AlarmManager won't trigger in specific time

I've got a problem with the AlarmManager. I'm able to set up the Alarm with this code

private void setAlarm(long when) {
    Intent intent = new Intent(NoteActivity.this, AlarmReceiver.class);
    intent.putExtra("ID", note.getId());
    AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, PendingIntent.getBroadcast(NoteActivity.this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));
    Toast.makeText(getApplicationContext(),"Reminder set up", Toast.LENGTH_SHORT).show();
}

This code works well if I set long when = 5 * 1000; \\For example 5secs later, but if I use this code

Calendar calendar = Calendar.getInstance();
                    calendar.setTime(date);
                    long selectedDate = date.getTime();
                    long timeSince1970 = System.currentTimeMillis();
                    long timeForAlarm = selectedDate - timeSince1970;

                    Intent intent = new Intent(NoteActivity.this, AlarmReceiver.class);
                    intent.putExtra("ID", note.getId());
                    AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, timeForAlarm, PendingIntent.getBroadcast(NoteActivity.this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));
                    Toast.makeText(getApplicationContext(),"Reminder set for "+calendar.getTime().toString(), Toast.LENGTH_SHORT).show();

my alarm triggerd 2secs later. What I'm doing wrong? :/ I've tried AlarmManager.ELAPSED_REALTIME_WAKEUP and AlarmManager.RTC_WAKEUP but nothing changed.

Please do not check my question as duplicated. I didn't find something to try that solved my problem.

Upvotes: 2

Views: 369

Answers (2)

gautam
gautam

Reputation: 1841

Instead of set use setExact

 manager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, timeForAlarm, PendingIntent.getBroadcast(NoteActivity.this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT));

Upvotes: 0

Divers
Divers

Reputation: 9569

Assuming that you are working in Android Studio (if not - you must switch), click F1 while your text pointer is on set method and read description of AlarmManager::set.

Note: Beginning in API 19, the trigger time passed to this method is treated as inexact: the alarm will not be delivered before this time, but may be deferred and delivered some time later. The OS will use this policy in order to "batch" alarms together across the entire system, minimizing the number of times the device needs to "wake up" and minimizing battery use. In general, alarms scheduled in the near future will not be deferred as long as alarms scheduled far in the future.

Upvotes: 2

Related Questions