안드로이드 AlarmManager 이용하여 설정 시간대에 알람 울리게 하기

조회수 10648회
//alarmBtn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {

               Intent intent = new Intent(DialogActivity3.this, AlarmDialogActivity.class);
               PendingIntent pIntent = PendingIntent.getActivity(DialogActivity3.this, 0, intent, 0);
               // 1회 알람 시작
               alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 4500, pIntent);

           }
       });
   }

일단 이렇게 버튼을 누르면 4.5초뒤에 설정해놓은 다른 액티비티가 뜨게끔 만들었습니다.

timepicker 같은걸로 시간을 설정하면.. 핸드폰 시간과 연동되서 그 시간에 알람이 울리게 하고싶습니다..

setTimeZone 함수를 사용하면되는건가요?

아니면 다른 방법인가요?

구글링해서 예제를 봐도 시간설정해서 실제로 그시간에 울리게하는건 없네요..

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

1 답변

  • AlarmManager.set() 함수의 두번째 파라미터가 알람이 트리거 되는 시간입니다. 예를 들어서 2016년 9월 1일 오전 8시에 알람이 트리거 되게하고 싶다면 작성하신 코드에서 다음을 추가하면 됩니다.

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, 2016);
    calendar.set(Calendar.MONTH, Calendar.SEPTEMBER);
    calendar.set(Calendar.DATE, 1);
    calendar.set(Calendar.HOUR_OF_DAY, 8);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
    

    위 예시에서는 Calendar로 알람 시간을 직접 설정했지만 TimePicker를 이용해서 사용자가 직접 시간을 설정하고, 설정된 시간을 가져오는 부분만 추가하면 만들고자 하는 기능을 어렵지 않게 구현 할 수 있습니다.

    참고로 API 19부터 배터리 효율을 위해 AlarmManager.set() 함수는 정확한 시간에 알람이 동작하지 않을 수 있습니다. 정확한 알람이 필요할 경우, API 19 이상에서는 setExact() 함수를 사용하세요. 관련된 내용은 아래 페이지에서 set() 함수 부분을 참고하시기 바랍니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 질문자는 아닌데, 혹시 질문하나 해도 될까요? 제가 Calendar객체에 set함수로 년/월/일/시/분/초를 설정해 setRepeating을 했는데요, 시간이 오전 8시라고 하면 오후 8시(20시)에도 알람이 울립니다. 혹시 24시간 계산법에서도 AM/PM 도 설정을 따로 해줘야 하나요? hee 2016.8.26 02:38
    • HOUR_OF_DAY로 설정할 경우, AM/PM 설정은 하지 않아도 됩니다. setRepeating()을 사용하셨다고 하셨는데, setRepeating() 함수의 세번째 파라미터가 알람을 반복하는 주기입니다. 이 값이 12시간으로 설정되어 있는 것은 아닌지 확인해보세요. 알 수 없는 사용자 2016.8.26 02:49
    • alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent); 라고 적었습니다. cal이 Calendar 변수에요. INTERVAL_DAY는 1000*60*60*24에 해당하는 상수값이더라구요.. hee 2016.8.26 14:07
    • calendar.currentTimeMillis() 는 없는 메소드네요... 혹시 System.currentTimeMillis()와 헷갈리신거 아닌지요 ㅠㅠ calendar.getTimeInMillis()로 해야되지않나요?? 알 수 없는 사용자 2016.8.26 14:25
    • @Jun Yong Lee 코드를 입력창에서 그냥 작성하다보니 실수를 했네요. 말씀하신 getTimeInMillis()가 맞습니다. 알 수 없는 사용자 2016.8.26 14:37
    • @hee INTERVAL_DAY이면 24시간 뒤에 트리거 될 것 같은데 이상하네요. ^^;; 알 수 없는 사용자 2016.8.26 14:38
    • @한로니로니 마지막으로 한 가지만 더 여쭙겠습니다.. 위에 적어주신대로 calendar를 set하고 Date date = calendar.getTime(); 로 로그를 찍어보니 8시가 안찍히고 17시로 찍힙니다.. 몇시간 오차가 있는거 같은데 이건 어떻게 수정해야하나요? I/로그찍기: Fri Aug 26 17:00:00 GMT+09:00 2016 이렇게 찍히네요... 8월 26일은 제가 일부러 수정한 부분이 맞습니다 알 수 없는 사용자 2016.8.26 14:46

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

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

(ಠ_ಠ)
(ಠ‿ಠ)