Reputation: 65
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..
Upvotes: 5
Views: 7435
Reputation: 321
I think you should use the function
setExactAndAllowWhileIdle
For example:
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() + 100, pendingIntent); // +100 is to set nearly to the current time
You have to know that this is not a repeating alarm, so at the end of your BroadcastReceiver you should set the next alarm.
Regards
Upvotes: 2
Reputation: 1007554
You have two issues:
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
.
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.
Upvotes: 11