AlarmManager를 활용한 다중 알람 생성

조회수 7797회

안녕하세요. 안드로이드에서 AlarmManager와 PengingIntent를 이용해 알람을 만들고 있습니다. 매일 아침, 점심, 저녁 이렇게 세 번 알람이 울리는데요, 알람이 제대로 동작하지 않습니다. 알람이 한참 뒤에 울리거나(1~2분 정도 오차가 아니라 10분 넘게 차이가 납니다), 아침에 아침/점심/저녁 알람이 한꺼번에 울리기도 합니다.

대략적인 방식은 이렇습니다 Activity가 3개의 TimePickerDialog로 각각의 시간을 받아 놓고, AlarmReceiver에 넘깁니다. 그러면 AlarmReceiver의 addAlarm() 함수가 값을 받아 알람을 추가합니다. 등록된 알람들은 시간이 되면 AlarmReceiver의 onReceive()함수를 실행시키고, onReceive에서 AlarmActivity를 화면에 띄웁니다.

코드는 이렇습니다.

AlarmReceiver.java의 addAlarm()

Intent intent = new Intent(con, AlarmReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
Calendar cal = new GregorianCalendar(); // 시간을 정하기 위한 Calendar 객체
cal.set(2016, 7, 27, morningHour, morningMinute, 0); // Hour과 Minute은 TimePickerDialog로 가져옴
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent); // 하루에 한 번 반복되는 알람 설정

intent = new Intent(con, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
cal.set(2016, 7, 27, lunchHour, lunchMinute, 0); // TimePickerDialog로 가져옴
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);

intent = new Intent(con, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
cal.set(2016, 7, 27, dinnerHour, dinnerMinute, 0); // TimePickerDialog로 가져옴
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);

변수들(아침, 점심, 저녁의 시간/분)은 전부 다른 값이 들어갔습니다. AlarmManager의 사용법이 생각보다 까다롭네요ㅜㅜ

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    setInexactRepeating() 함수는 이름이 의미하는 것처럼 정확도가 떨어지는 알람 설정 함수입니다. 오차를 허용하는 알람을 설정할 때 사용한다고 이해하시면 될 것 같고요. API 19 미만에서는 setRepeating() 함수를 이용해서 정확한 반복 알람을 설정할 수 있었지만 API 19부터는 이 함수 조차도 정확한 시간을 보장하지 않습니다. 따라서 정확한 알람을 반복하기 위해서는 setExact() 함수를 이용해야 하고, 반복(다음 알람 트리거 시간)에 대한 부분은 직접 구현을 해야 합니다. 관련된 내용은 아래 문서를 확인하세요.

    Note: as of API 19, all repeating alarms are inexact. If your application needs precise delivery times then it must use one-time exact alarms, rescheduling each time as described above. Legacy applications whose targetSdkVersion is earlier than API 19 will continue to have all of their alarms, including repeating alarms, treated as exact.

    관련해서 참고할만한 구현은 다음 링크를 확인하세요.

    덧붙여 알람에 대한 전반적인 부분을 살펴볼 수 있는 다음 글도 도움이 될 것 같습니다. (한글)

    그리고 트리거 시간이 현재보다 이전 시간으로 설정된 경우, 알람은 즉시 실행됩니다. 아침/점심/저녁이 한꺼번에 울리는 현상은 이런 케이스로 추측이 되고요. 이부분에 대한 처리는 다음 링크를 참고하세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)