애플리케이션을 작성하다 보면 원하는 시간에 특정 작업을 수행하도록 해야 하는 경우가 있습니다. 알람 시계가 대표적인 예라 할 수 있지요.
애플리케이션에서 특정 시간에 어떤 작업을 실행하도록 하는 방법은 매우 다양합니다. 여기에서는 비교적 쉽고 간편하게 특정 시간에 원하는 작업을 수행하도록 할 수 있는 AlarmManger의 사용 방법에 대해 소개합니다.
AlarmManger는 다음 요소와 관련된 작업을 쉽게 처리할 수 있도록 합니다.
- 어떤 시간을 기준으로 하는가?
- 단말기가 대기 모드일 때도 작업을 수행할 것인가?
- 단발성인가, 반복해서 수행하는가?
- 정확한 시각에 수행되어야 하는가?
각 특성과 관련있는 항목에 대해 자세히 알아보겠습니다.
어떤 시간을 기준으로 하는가?
알람을 실행할 때 기준으로 할 시각을 설정합니다. 단말기가 시작된 이후로 경과된 시간(ELAPSED_REALTIME) 혹은 실제 시간 (RTC; Real-time clock) 중 하나를 기준으로 합니다.
단말기가 대기 모드일 때도 작업을 수행할 것인가?
단말기가 대기 상태일때도 작업을 수행할지, 아니면 대기 상태에서는 작업을 수행하지 않을지 결정합니다. 대기 상태일 때 작업을 수행할 경우 단말기가 대기 상태에서 깨어나 작업을 수행합니다.
위의 두 가지 특징을 조합하여 AlarmManager에서 알람의 속성을 지정합니다. AlarmManager에서 지정할 수 있는 알람 속성은 다음과 같습니다.
- AlarmManager.ELAPSED_REALTIME : 단말기가 부팅된 이후 경과된 시간을 기준으로 합니다.
- AlarmManager.ELAPSED_REALTIME_WAKEUP : ELAPSED_REALTIME과 동일하며, 대기상태일 경우 단말기를 활성상태로 전환한 후 작업을 수행합니다.
- AlarmManager.RTC : 실제 시간을 기준으로 합니다.
- AlarmManager.RTC_WAKEUP : RTC와 동일하며, 대기상태일 경우 단말기를 활성 상태로 전환한 후 작업을 수행합니다.
단발성인가, 반복해서 수행하는가?
알람을 설정한 후 한 번만 수행되도록 할 지, 반복해서 수행되도록 할 지 설정합니다.
정확한 시각에 수행되어야 하는가?
알람이 지정된 시각에 정확히 수행되어야 할지, 아니면 어느 정도의 오차가 있어도 무방할지 설정합니다. 정확한 시각에 실행되도록 해야 할 경우 배터리를 추가로 소모하므로 필요에 따라 적절한 것을 설정합니다.
위에서 정리한 내용들을 기반으로 AlarmManager를 사용하여 알람을 관리하는 메서드에 대해 알아보겠습니다.
API
public void set (int type, long triggerAtTime, PendingIntent operation)
한 번만 수행되는 알람을 예약합니다.
public void set (int type, long triggerAtTime, PendingIntent operation)
한 번만 수행되는 알람을 예약합니다.
type에는 알람의 속성을 지정합니다. 알람에서 기준으로 할 시간 및 대기 모드에서도 알람을 실행할지 여부를 설정하게 됩니다. triggerAtTime에는 알람을 실행할 시각을, operation에는 실행할 작업을 지정합니다.
triggerAtTime에 들어가는 알람 실행 시각은 알람 속성에 따라 기준 시각이 달라집니다. ELAPSED_REALTIME을 기준으로 하는 알람일 경우 SystemClock.elapsedRealtime()을 사용하여 단말기가 부트된 이후로 경과된 시각을 받아 사용하면 되고, RTC를 기준으로 하는 알람일 경우 일반적으로 많이 사용하는 System.currentTimeMillis()를 사용하여 밀리초 단위의 시각을 받아 사용하면 됩니다.
다음, 반복되는 알람을 설정하는 메서드를 알아보겠습니다.
API
public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
반복되는 알람을 예약합니다.
public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
반복되는 알람을 예약합니다.
다른 속성들은 set() 메서드와 동일하며, interval에는 알람 실행 주기를 밀리초 단위로 입력합니다. 이 알람은 항상 지정된 시각에 정확하게 수행됩니다.
지정된 시각에 굳이 '정확히' 수행될 필요는 없고 지정된 시각과 근사하게 실행되기만 하면 무방한 경우에는 다음 메서드를 사용하면 배터리 소모를 절약할 수 있습니다.
API
public void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
setRepeating() 메서드와 동일하나, 알람이 지정된 시각에 정확하게 일어나지 않을 수 있습니다. 정확성보다는 일정 주기로 특정 작업을 수행하기만 하면 될 때 사용합니다.
public void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
setRepeating() 메서드와 동일하나, 알람이 지정된 시각에 정확하게 일어나지 않을 수 있습니다. 정확성보다는 일정 주기로 특정 작업을 수행하기만 하면 될 때 사용합니다.
다음 포스트에서는 AlarmManager를 사용하는 예를 통해 자세한 사용법을 알아보겠습니다. :)
'안드로이드 개발 팁 > 일반' 카테고리의 다른 글
단말기에 애플리케이션을 올릴 때 timeout이 발생하면서 실행되지 않을 때? (2) | 2011.10.30 |
---|---|
에뮬레이터의 애플리케이션 설치 공간이 부족할땐? (0) | 2011.10.29 |
Draw9Patch가 실행되지 않을 때? (0) | 2011.01.13 |
이클립스에서 레이아웃 구성 확인하기 (Hierarchy View, using ADT) (5) | 2011.01.01 |
hierarchyviewer가 없어졌어요?! (1) | 2010.12.01 |