버그 잡이

Kotlin AlarmManager로 알람 앱 만들기 본문

안드로이드

Kotlin AlarmManager로 알람 앱 만들기

버그잡이 2020. 4. 24. 20:36

내가 AlarmManager를 활용해서 만들고 싶은 앱은 notification을 띄우는 알람이 아니고 우리가 아침마다 쓰는 알람앱이다.

 

 

1. AlarmManager 기본 사용법

 

기본적인 흐름은 아래의 세단계이다.

 

1) AlarmManager 객체를 만들고

 

2) PendingIntent를 만들고

 

3) AlarmManager를 셋팅한다.

 

 

(이와 관련해서 안드로이드 공식 문서에 코드와 세부 셋팅까지 친절하게 잘 나와있다.)

https://developer.android.com/training/scheduling/alarms

 

 

 

2. Doze 모드 대응

 

안드로이드 앱은 화면이 꺼진 경우 배터리 최적화를 위해서 도즈가 진행된다. 이로 인해 각종 기능들이 제한을 받을 수 있다. 알람 매니저도 이에 해당한다. 기존의 setExact()와 같은 메서드로 알람매니저를 셋팅한다면 도즈 및 대기모드에서 앱을 깨우는 것이 불가능하다.

 

이에 대한 대응 방법으로

 

setAndAllowWhileIdle() : 해당 앱만 도즈 모드에서 잠깐 깨어난다.

setExactAndAllowWhileIdle() :  해당 앱반 도즈 모드에서 잠깐 깨어난다. (위에꺼보다 좀 더 정확한 시간에 알람 동작)

setAlarmClock() : 해당 앱 뿐만 아니라 다른 앱까지 도즈 상태에서 벗어난다.

 

http://blog.naver.com/nife0719/221029613969

관련 내용은 위 블로그에 구체적으로 설명되어 있다.

 

 

 

 

3. 화면 켜짐 : WakeLock

 

나는 알람 앱이기 때문에 화면이 꺼져있는 경우 알램매니저 동작시 기기의 화면이 켜져야 한다. 

(여기서 좀 삽질을 했다....)

 

나는 RTC_WAKEUP으로 셋팅하면 알람매니저가 동작할때 화면이 켜지는 줄 알았다.

그런데 알고보니 RTC_WAKEUP은 절전모드를 해제해주는 것이지 화면 켜지는 것과는 관련이 없는 것 같다.

(나는 왜 화면이 켜지는 것과 관련이 있다고 생각한거지....?)

 

좀 더 알아보니 WakeLock이라는 것을 활용하면 화면을 킬 수 있다.

단 WakeLock를 사용하는 것은 배터리 부담이 크기 때문에 timeout을 설정하거나 release()를 제때해줘야한다.

 

*관련 코드

https://webnautes.tistory.com/1368

 

*WakeLock 관련 자료

https://d2.naver.com/helloworld/632413

 

 

 

 

3-1. WakeLock deprecated

 

사용해보면 알겠지만 wakelock 설정 중 FULL_WAKE_LOCK 설정이 화면을 켜주는 역할인데 deprecated 되어있다...

 

대안책을 열심히 구글링 해봤지만 마땅한 대안책이 없다... 일단은 그냥 쓰자...

 

(관련하여 좋은 대안책을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!)

반응형
Comments