After reading lots of sample code into this matter, I'm trying to figure out the simplest way to achieve the following:
I want to be able to schedule an Intent that calls back to my Alarm BroadcastReceiver, which in turn fires off my Service. However, I want to set up so that it calls said Intent twice a day and to only schedule the alarms if they haven't already been set (likewise for canceling the alarms).
However, I am unsure if the following code is the correct way to set and cancel alarms.
//Static function for setting the alarm
//My midday calendar object (cal1)
...
//My evening calendar object (cal2)
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE)
Intent myIntent = new Intent(context, MyAlarmReceiver.class);
PendingIntent firstCallIntent = PendingIntent.getBroadcast(context, FIRST_CALL_ID, myIntent, PendingIntent.FLAG_NO_CREATE);
PendingIntent secondCallIntent= PendingIntent.getBroadcast(context, SECOND_CALL_ID, myIntent, PendingIntent.FLAG_NO_CREATE);
if(firstCallIntent == null){
if(DEBUG){
Log.d(TAG, "Setting Midday Alarm");
}
firstCallIntent = PendingIntent.getBroadcast(context, FIRST_CALL_ID, myIntent, 0);
alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), AlarmManager.INTERVAL_DAY, firstCallIntent);
}
if(secondCallIntent == null){
if(DEBUG){
Log.d(TAG, "Setting Evening Alarm");
}
secondCallIntent = PendingIntent.getBroadcast(context, SECOND_CALL_ID, myIntent, 0);
alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), AlarmManager.INTERVAL_DAY, secondCallIntent);
}
//Static call to cancel the alarm.
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE)
Intent myIntent = new Intent(context, MyAlarmReceiver.class);
PendingIntent firstCallIntent = PendingIntent.getBroadcast(context, FIRST_CALL_ID, myIntent, 0);
alarms.cancel(firstCallIntent);
firstCallIntent.cancel();
PendingIntent secondCallIntent = PendingIntent.getBroadcast(context, SECOND_CALL_ID, myIntent, 0);
alarms.cancel(secondCallIntent);
secondCallIntent.cancel();
That seems alright to me, however instead of creating two calendar objects you could just set your interval to
AlarmManager.INTERVAL_DAY/2
unless your intents are doing different things.
Also,
alarms.cancel(firstCallIntent);
alarms.cancel(secondCallIntent);
should be enough to cancel all alarms of those types, no need for:
firstCallIntent.cancel();
Edit: Setting 2 calendar objects
//midday
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.HOUR_OF_DAY, 12);
cal1.set(Calendar.MINUTE, 00);
cal1.set(Calendar.SECOND, 00);
//7pm
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.HOUR_OF_DAY, 19);
cal2.set(Calendar.MINUTE, 00);
cal2.set(Calendar.SECOND, 00);
Calendar.getInstance() will return a calendar object and set it to the current system time. Each .set method changes a certain variable of that calendar object. So currently if it was 8pm, it would set the alarm for 12 and 7 that day, which would be no use. So if you want to set it for the next day, you'll need to use cal1.add(Calendar.DAY_OF_MONTH, 01); to add an extra day, setting for that time the next day. Hope this helps.