이 문제를 내 프로젝트에서 이런 식으로 프로그래밍했습니다. 아래 코드에서 내가 사용하고 있습니다.
AlarmManager.ELAPSED_REALTIME_WAKEUP
특정 시간에 알람을 설정합니다. 이 알람을 수신하기 위해 인 텐트 필터에서 변수 'intentName'이 사용됩니다. 이런 유형의 알람을 많이 발동하고 있기 때문입니다. 모든 알람을 취소 할 때. 취소 방법을 사용합니다. 하단에 주어집니다.
// 알람을 보류하고 필요할 때 취소
public static ArrayList<String> alarmIntens = new ArrayList<String>();
//
public static String setAlarm(int hour, int minutes, long repeatInterval,
final Context c) {
Time nowTime = new Time();
nowTime.setToNow();
Time startTime = new Time(nowTime);
startTime.hour = hour;
startTime.minute = minutes;
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);
long elapsedRealTime = SystemClock.elapsedRealtime();
Time t1 = new Time();
t1.set(elapsedRealTime);
t1.second=0;
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);
스팬 함수는 다음과 같습니다.
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);
}
알람 해제 기능은 이쪽입니다.
public static void cancel(Context c) {
AlarmManager am = (AlarmManager) c
.getSystemService(Context.ALARM_SERVICE);
for (Iterator<String> iterator = alarmIntens.iterator(); iterator
.hasNext();) {
String intentName = (String) iterator.next();
Intent intent = new Intent(intentName);
PendingIntent pi = PendingIntent.getBroadcast(c, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pi);
iterator.remove();
}
}