IT 프로그래밍-Android

[안드로이드] AlarmManager 사용 시 주의할 점

godsangin 2022. 2. 6. 14:37
반응형

안녕하세요.

오늘은 며칠째 말썽을 부린 알람매니저와 관련한 내용으로 찾아왔습니다.

 

일정한 시간을 기준으로 실시간으로 업데이트되는 기능을 만들기 위하여, 브로드캐스트리시버와 알람매니저를 함께 쓰고자 하였는데, 코드를 아무리 수정해도 알람매니저가 동작하지 않는 문제가 있었습니다.

 

나중에 알고보니 웹서핑으로 얻은 지식의 한계를 맞이한 것이더라구요...ㅎㅎ

 

제가 작성한 코드는 다음과 같습니다.

fun makeAlarmUpdate(context:Context?, time:Long){
        val alarmManager = context?.getSystemService(AppCompatActivity.ALARM_SERVICE) as AlarmManager
        val alarmIntent = Intent(context, WidgetProvider::class.java)
        alarmIntent.putExtra("action", MY_UPDATE_ACTION)
        val pendingIntent = PendingIntent.getBroadcast(context,
            1000,
            alarmIntent,
            PendingIntent.FLAG_UPDATE_CURRENT
        )
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            time,
            pendingIntent)
    }

자 ! 이코드에서 어떤부분에 문제가 발생하였을까요 ??

사실 이 부분만 보면 문제가 없다고 볼 수도 있습니다.

문제는 사실 makeAlarmUpdate의 매개변수인 time에서 발생하였습니다.

 

저는 time을 다음과 같이 정의하였습니다.

val time = System.currentTimeMillis + myTime //myTime은 사용자가 설정한 시간

어떤부분이 문제일까요 ??

정답은 System.currentTimeMillis입니다.

 

알람매니저 set함수의 첫번째 인자는 알람을 울릴 시간의 유형을 지정하는 것인데요.

다음의 네가지 유형을 지정할 수 있습니다(https://developer.android.com/training/scheduling/alarms?hl=ko 참조)

ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC, RTC_WAKEUP

 

ELAPSED ~~ 의 경우 기기의 부팅시점을 기준으로 한 시간이고, RTC ~~ 의 경우 실제 시간을 기준으로 한 것이었습니다 !!!

정말 허무하게도 저는 기기의 부팅시점을 기준으로 실제 시간만큼 흐른 뒤 알람을 예약했기 때문에 아마도 저는 살아생전 그 알림을 받을 수 없을지도 몰랐습니다.(1970년을 기준으로 2022년인 52년을 시간으로 작성하였는데, 부팅시점을 기준으로 하면 2074년에 받을 수 있었겠지요...)

 

그래서 !! 다음과 같이 코드를 변경하여 문제를 해결할 수 있었습니다.

val time = SystemClock.elapsedRealtime() + myTime //myTime은 사용자가 설정한 시간

SystemClock.elapsedRealtime() - 기기가 부팅된 후 현재 시간을 반환받는 함수

 

여러분들도 알람매니저를 사용할때는 이점을 주의하시길 바랍니다.

 

그럼 ! 새해 복 많으시고, 좋은일들만 가득하시길 바랍니다~~(저두요 제발)