Duty Cycling with AlarmManager
- Alarm Service 특징
- 설정한 시각 혹은 일정 주기마다 필요한 Intent를 실행할 수 있게 해 준다.
- 다른 필요한 연산을 수행할 수 있게 서비스를 시작하는 Broadcast Receiver와 함께 사용할 수 있다.
- 애플리케이션이 실행 중이지 않을 때나 디바이스가 sleep 상태에 있을 때도 애플리케이션에서 어떤 액션을 수행할 수 있게 해 준다.
- 애플리케이션의 자원 사용량을 최소화할 수 있도록 도와준다.
- 그러나 Alarm을 잘못 사용하면 불필요한 자원 낭비 발생 가능
- Alarm Service의 주된 사용 목적
- 애플리케이션이 실행 중이지 않거나, 디바이스가 sleep 상태인 경우에도 미래 특정 시점에 어떤 작업을 수행해야 할 경우
- 일반적인 애플리케이션 실행 시간 동안에 일어날 것이 확실한 timing 연산의 경우는 Handler 클래스를 Timer나 Thread와 함께 사용하여 처리하는 것이 좋다.
- AlarmManger를 이용한 애플리케이션 동작
- Alarm 발생 설정
- 시간 기준
- 부팅 후 경과 시간(elapsed time) vs 실제 시간(RTC : real time clock)
- AlarmManager.ELAPSED_REALTIME
- 디바이스가 부팅된 이후 경과된 시간을 기준으로 함
- Wakelock 아님
- AlaramManager.RTC
- 실제 시각을 기준으로 함
- Wakelock 아님
- Sleep 상태에서 수행 여부
- 디바이스가 sleep 상태에 있으면 wake up을 하고 작업 수행
- sleep 상태에서는 수행하지 않는다.
- AlarmManager.ELAPSED_REALTIME_WAKEUP
- ELAPSED_REALTIME과 동일하며 sleep 상태일 경우 디바이스를 활성 상태로 전환한 후 작업 수행
(시스템 내부적으로 wakelock을 잡음)
- ELAPSED_REALTIME과 동일하며 sleep 상태일 경우 디바이스를 활성 상태로 전환한 후 작업 수행
- AlarmManager.RTC_WAKEUP
- RTC와 동일하며, sleep 상태일 경우 디바이스를 활성 상태로 전환한 후 작업 수행
- 일회성 알람 vs 반복 알람
- AlarmManager의 alarm 설정 메소드를 이용하여 지정
- set() vs setRepaeting()
- 자동으로 repeating 되는 것은 사라졌기 때문에 setExact를 반복 사용하는 방식으로 구현해야 한다.
- setExact 함수로 일회성 알람을 예약하고,
알람 발생 시 다시 setExact 함수를 이용하여 동일한 조건의 알람을 예약
- setExact 함수로 일회성 알람을 예약하고,
- 정확한 시각에 수행 vs 오차 허용
- setExact() vs setInexactRepeating()
- 정확한 시점에 알람을 주는 것이 아니라 OS가 자체적으로 시간을 조절하게 되면
자원 사용에 미치는 영향을 줄일 수 있다. - 여러 개의 애플리케이션에서 알람 발생 요청이 있을 때, 그것들을 모아서 비슷한 시간대에 있는 알람은 그 타이밍에 일괄적으로 발생시킨다.
- 시간 기준
Wakelock을 사용하지 않고 sleep 상태에서도 주기적으로 WiFi Scan을 하도록 만들어보자.
AlarmManger를 이용해서 sleep 상태에서도 wifi scan을 했을 때 power 소모량을 비교해보자.
Power Monitor로 동작 확인을 해보면
wakelock을 사용하면 50mW 정도 계속해서 사용하는 것을 확인할 수 있다.
크지 않다고 느낄 수 있지만 이게 계속 지속된다면 큰 차이로 나타날 수 있다.
Doze mode (잠자기 모드) - (Anrdoid 6.0 - API level 23)
Doze mode에 들어가면 AlarmManager가 제한이 된다.
- Doze 모드 진입 조건
- 충전 중이 아님
- 스크린이 꺼져 있음
- 디바이스가 일정 시간 동안 움직임이 없음
- 디바이스가 사용되지 않는 동안 배터리 소모를 줄이기 위해 사용
https://developer.android.com/training/monitoring-device-state/doze-standby.html
- 표준 AlarmManager 알람은 다음 유지관리 기간으로 연기된다.
- setExact() 및 setWindow() 포함
- Doze 모드 중 알람이 실행되도록 설정해야 하는 경우
- setAndAllowWhileIdle() → set()과 유사
- setExactAndAllowWhileIdle() → setExact()과 유사
- 최소 주기 시간 : 1분에 한번(비 Doze 모드), 15분(Doze 모드)
- setAlarmClock()으로 설정된 알람은 정상적으로 실행됨
- 알람이 실행되기 직전에 Doze 모드 종료됨
'School Study > Mobile System Programming' 카테고리의 다른 글
Energy-efficient Mobile Sensing System Design 1 (0) | 2019.04.30 |
---|---|
GPS, WiFi를 이용한 위치 모니터링(Location Tracker) (0) | 2019.04.23 |
Mobile Sensing Pipeline 2 (0) | 2019.04.23 |
Mobile Sensing Pipeline 1 (0) | 2019.04.17 |
Mobile Device Power Measurement (0) | 2019.04.16 |