본문 바로가기

안드로이드/코틀린

[Android]AlarmManager를 이용해 위젯을 업데이트 하자!

반응형

시간 단위로 화면을 보여주는 일정 위젯의 경우 일정 시간마다 업데이트 해야 합니다. 만약 30분 이상의 텀을 갖고 위젯을 업데이트 한다면 편하게 provider를 이용해서 주기적으로 업데이트 하는 방법을 이용하시고  30분이하나 불규칙하게 업데이트 하신다면 AlarmManager를 이용해서 업데이트 해보세요

 

위젯 관련 다른 포스팅

공통 알람 등록

private fun startAlarm(context: Context, alarmId: Int, intent: Intent, intervalTime: Long) {
            var alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            var pendingIntent = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT)


            if (Build.VERSION.SDK_INT >= 23) {
                alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + intervalTime, pendingIntent)
            } else if (Build.VERSION.SDK_INT >= 19) {
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + intervalTime, pendingIntent)
            } else {
                alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + intervalTime, pendingIntent)
            }
        }

현재 시간에서 일정 시간이 지난 뒤 알람이 울리고 잠들어 있는 경우 깨우기 위해 'RTC_WAKTEUP' 를 사용했고 공통으로 사용하기 위한 메소드를 먼저 만들었습니다. 'RTC_WAKTEUP' 외의 자세한 정보를 알고 싶으시면 제 포스팅을 참고해주세요  클릭클릭!

 

PendingIntent 생성시 2번째 인자로 넘겨준 알람 아이디는 앱내에서 사용하는 알람들을 관리하는 용도로 사용되기 때문에 별도 클래스를 생성해서 정적 변수로 관리하고 있습니다. 다중 알람을 사용하시게 된다면 필수로 체크해야 하는 부분이고 등록한 알람을 취소할때도 필요합니다.

4번째 인자로 FLAG_UPDAT_CURRENT 넘겨줄 경우 해당 알람 아이디로 등록된 알람이 있을 경우 최근에 등록한 알람으로 업데이트 됩니다.

위젯 업데이트 알람 등록

fun startUpdateWidgetAlarm(context: Context) {


            var intent = Intent(context, Provider_WidgetToday::class.java)
            intent.action = Provider_WidgetToday.ACTION_REPEAT_UPDATE

            var pendingIntent = PendingIntent.getBroadcast(context, ID_UPDATE_WIDGET, intent, PendingIntent.FLAG_NO_CREATE)


            var calendar = Calendar.getInstance()
            var nowMin = calendar.get(Calendar.MINUTE).toLong()// 현재 분
            var nowSec = calendar.get(Calendar.SECOND).toLong()// 현재 초

            // 위젯이 정각마다 뷰를 업데이트 해야하기 때문에
            // 현재 시간에서 정각까지 남은 시간을 구해서 해당 시간 뒤에 알람이 울리도록 한다.
            var intervalTime: Long = (59 - nowMin) * 60 * 1000 + ((60 - nowSec) * 1000)

            startAlarm(context, ID_UPDATE_WIDGET, intent, intervalTime);

        }

저는 정각마다 위젯을 업데이트 하는 구조라서 알람 등록 당시 현재 시간에서 정각까지 남은 시간을 계산해서 등록 했습니다.

공통 알람 삭제

 private fun stopAlarm(context: Context, alarmId: Int, intent: Intent) {
            var alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            var pendingIntent = PendingIntent.getBroadcast(context, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
 
            if (pendingIntent != null) {
                alarmManager.cancel(pendingIntent)
                pendingIntent.cancel()
            }

        }

alarmId로 등록된 알람이 없으면 pendingIntent는 null이 나옵니다.

위젯 업데이트 알람 삭제

fun stopUpdateWidgetAlarm(context: Context) {
            var intent = Intent(context, Provider_WidgetToday::class.java)
            intent.action = Provider_WidgetToday.ACTION_REPEAT_UPDATE
            stopAlarm(context, ID_UPDATE_WIDGET, intent)
        }

알람 등록시 사용된 액션명까지 정확해야 취소되니 주의해주세요~ 

 

다중 위젯 사용시 알람 등록 및 취소 

한가지 종류의 위젯을 여러개 사용할 경우 한개의 알람으로 관리하는것이 용이하기 때문에 위젯 최초생성과 최종삭제시에만 알람을 등록하고 삭제해야합니다.

알람이 최초 생성 될땐 'onEnabled' 메소드가 호출되고 최종 삭제될땐 'onDisabled' 메소드가 호출됩니다. 위젯에대해 조금 더 자세한 정보를 알고 싶으시면 제 포스팅을 참고해주세요 클릭클릭!

하나의 알람으로 많은 위젯을 업데이트 하기 위해선 아이디를 내부디비로 관리하시면 될것 같습니다.

 

 

반응형