※ SCHEDULE_EXACT_ALARM 권한이 Android 13 이상을 대상으로 새로 설치된 대부분의 앱에서 더 이상 사전 부여 되지않는 이슈가 생겼습니다.
레이아웃 및 패키지 구성은
메인 화면 레이아웃은 위와 같습니다.
동작원리는 TimePicker에서 원하는 시간을 정하고 알람 설정 버튼을 누르면 그 시간에 알람이 울리는 방식입니다.
2-1. onCreate()
alarmManger 객체를 생성하고 alarmManger.canScheduleExactAlarms()를 통해 앱이 적절한 권한이 있는지 확인합니다.
2-2. onResume()
버튼을 클릭하면 현재 TimePicker에 설정된 시간과 분을 각각 hour, min 변수에 저장합니다.
그리고 TextView에 설정 시간을 나타내도록 합니다.
setAlarm 메서드를 통해 알람을 설정 합니다.
2-3. setAlarm()
설정한 시간과 분을 각각 hour, min으로 받아와서 calendar 객체를 생성하고
calendar 객체의 시간과 분에 hour, min으로 지정합니다.
alarmManager를 통해 설정된 calendar 시간으로 pendingIntent를 보내 알람을 설정합니다.
intent를 AlarmReceiver로 넘겨줄 수 있도록 합니다.
이때 intent는 그냥 intent가 아닌 pendingIntent입니다.
PendingIntent는 특정 시간에서의 이벤트를 수행하기 위한 intent입니다.
pendingIntent는 getBroadcast로 인텐트를 보내게 되는데
알아야할 매개변수는 requestCode와 flags입니다.
참고로 Pendingintent 이슈가 있어 PendingIntent.FLAG_IMMUTABLE 사용을 권고 드립니다.
setAlarmClock을 사용하는 이유
이전 글에서 3번 내용인 알아야 할 점에 설명이 적혀있으니 참고 바랍니다.
setAlarmClock를 왜 사용할까
3-1. 이벤트 발생을 위한 BroadcastReceiver
넘겨받은 PendingIntent로부터 이벤트를 실행시키기 위한 AlarmReceiver입니다.
알람은 벨 소리 대신 현재 시간을 알려주는 TTS 음성으로 구현했습니다.
3-2. 알람 발생
사용자가 설정했던 원하는 시간에 현재 시간을 출력과 동시에 TT S음성이 나오도록 했습니다.
4-1. Manifest 설정
정확한 시간의 알람을 위해선 퍼미션 추가가 필요합니다.
또 Receiver 사용 정의도 필요합니다.
영상을 첨부하여 TTS 음성이 나오는 걸 올리고 싶었으나 영상은 첨부가 안 되어 직접 해보시면 음성이 잘 나오는 것을 확인하실 수 있습니다.
참고로 어플을 종료 및 대기모드 상태(휴대폰 화면 끈 상태)에서도 TTS 음성이 나옵니다.
아래 사진은 알람이 울릴 때 토스트 메시지가 나오는 것을 확인할 수 있습니다.
참고자료
Alarm GitHub