Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alarm manager not triggering alarms at exact time in android

I scheduled alarm using Calendar class as below

Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY,1);
cal.getTimeInMillis();  
cal.set(Calendar.MINUTE,05);
long TriggerMillis = cal.getTimeInMillis();

AlarmManager aManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);      
aManager.set(AlarmManager.RTC_WAKEUP, TriggerMillis,pIntent);

where pIntent is an pending intent to proceed further when alarm triggers.

The event triggers with few seconds delay. Is that any problem using Calendar class for this task. Any suggestions?

TIA..

like image 515
Audhil Avatar asked Jan 25 '14 19:01

Audhil


People also ask

What is Android Alarm Manager?

android.app.AlarmManager. This class provides access to the system alarm services. These allow you to schedule your application to be run at some point in the future.


1 Answers

You have two issues:

  1. It is not reliable to use a _WAKEUP alarm with a service directly. The only reliable patterns involve WakefulBroadcastReceiver, my WakefulIntentService, or something along those lines, where the PendingIntent will be to a BroadcastReceiver.

  2. If your android:targetSdkVersion is 19 or higher, and you are running on an API Level 19+ device, set() is inexact. Ideally, you allow it to be inexact, or perhaps use setWindow() to control how off it will be, to minimize the power hit of your alarm event. If it absolutely has to occur at a precise moment, you will need to use setExact(). Since setWindow() and setExact() are new to API Level 19, you will need to fall back to set() on older devices, by examining Build.VERSION.SDK_INT and branching accordingly.

like image 125
CommonsWare Avatar answered Oct 04 '22 07:10

CommonsWare