Programé este problema en mi propio proyecto de esta manera. en el siguiente código estoy usando
AlarmManager.ELAPSED_REALTIME_WAKEUP
para configurar la alarma en un momento específico. la variable 'intentName' se usa en el intentFilter para recibir esta alarma. porque estoy disparando muchas alarmas de este tipo. cuando cancelo todas las alarmas utilizo el método cancelar. dado en la parte inferior.
// para mantener las alarmas y cancelar cuando sea necesario
public static ArrayList<String> alarmIntens = new ArrayList<String>();
//
public static String setAlarm(int hour, int minutes, long repeatInterval,
final Context c) {
/*
* to use elapsed realTime monotonic clock, and fire alarm at a specific time
* we need to know the span between current time and the time of alarm.
* then we can add this span to 'elapsedRealTime' to fire the alarm at that time
* this way we can get alarms even when device is in sleep mood
*/
Time nowTime = new Time();
nowTime.setToNow();
Time startTime = new Time(nowTime);
startTime.hour = hour;
startTime.minute = minutes;
//get the span from current time to alarm time 'startTime'
long spanToStart = TimeUtils.spanInMillis(nowTime, startTime);
//
intentName = "AlarmBroadcast_" + nowTime.toString();
Intent intent = new Intent(intentName);
alarmIntens.add(intentName);
PendingIntent pi = PendingIntent.getBroadcast(c, alarms++, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
//
AlarmManager am = (AlarmManager) c
.getSystemService(Context.ALARM_SERVICE);
//adding span to elapsedRealTime
long elapsedRealTime = SystemClock.elapsedRealtime();
Time t1 = new Time();
t1.set(elapsedRealTime);
t1.second=0;//cut inexact timings, seconds etc
elapsedRealTime = t1.toMillis(true);
if (!(repeatInterval == -1))
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
elapsedRealTime + spanToStart, repeatInterval, pi);
else
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, elapsedRealTime
+ spanToStart, pi);
donde la función palmo es la siguiente:
public static long spanInMillis(Time startTime, Time endTime) {
long diff = endTime.toMillis(true) - startTime.toMillis(true);
if (diff >= 0)
return diff;
else
return AlarmManager.INTERVAL_DAY - Math.abs(diff);
}
alarma cancelar la función es la siguiente.
public static void cancel(Context c) {
AlarmManager am = (AlarmManager) c
.getSystemService(Context.ALARM_SERVICE);
// cancel all alarms
for (Iterator<String> iterator = alarmIntens.iterator(); iterator
.hasNext();) {
String intentName = (String) iterator.next();
// cancel
Intent intent = new Intent(intentName);
PendingIntent pi = PendingIntent.getBroadcast(c, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pi);
//
iterator.remove();
}
}
Eso es lo que pensaba. Solo necesitaba una confirmación. Entonces, si hice algo como esto: alarmManager.set (AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMills() + 30 * 1000, pendingIntent); cosas extrañas que podría suceder (que es lo que tenía hasta que me di cuenta de que no estaba funcionando como pensé. –
Tenga en cuenta que el código debería ser 'System.currentTimeMillis()' en lugar de 'System.currentTimeMills()' :) – HasanAboShally
"El tipo AlarmManager.ELAPSED_REALTIME_WAKEUP rara vez se usa en comparación con AlarmManager.RTC_WAKEUP". Esto es especulación y malos consejos. De acuerdo con la documentación: https://developer.android.com/training/scheduling/alarms.html "Si simplemente necesita que su alarma se dispare en un intervalo particular (por ejemplo, cada media hora), use uno de los tipos de tiempo real transcurridos. En general, esta es la mejor opción ". –