본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] background work(AlarmManager) 수행에 대한 이야기

by 돼지왕 왕돼지 2019. 1. 27.
반응형

[android] background work(AlarmManager) 수행에 대한 이야기


https://plus.google.com/+AndroidDevelopers/posts/GdNrQciPwqo


alarm, alarm manager, alarm manager api, alarmmanager, alarmmanager powersave, app icon, App Standby, background work, battery save, compat, doze, Foreground, GCMNetworkManager, getnextalarmclock, idle app, idle device, internal_hour, jobscheduler, Scheduling, Set, setAlarmClock, setandallowwhileidle, setexact, setExactAndAllowWhileIdle, setinexactrepeating, setrepeating, setwindow, Stay, system ui, targetapi, unplug, Unplugged, [android] background work(AlarmManager) 수행에 대한 이야기


-

구버전 안드로이드에서는 background work 를 위해서 보통 AlarmManager 를 사용했다.

AlarmManager 를 사용하면 앱이 foreground 가 아닌 상황에서도 미래 특정 시점에 어떤 일을 하도록 scheduling 을 할 수 있다.



-

60초 이내에 무언가를 수행하게 하고 싶다면 AlarmManager 는 best choice 가 아닐 수 있다.

이 때는 Handler 를 이용해보도록 하자.



-

API 21+ (5.0 LOS) 부터는 setAlrmClock() API 를 통해서 user 가 볼 수 있는 alarm 을 등록할 수 있다.

이 알람은 system UI 로 app icon 과 시간이 나올 수 있다.(원문은 may 라고 표현)

앱에서는 getNextAlarmClock() 을 통해 다음 alarm clock 을 가져올 수도 있다.

setAlarmClock 으로 설정된 alarm 은 device/app 이 idle 인 경우에도 작동한다. (setExactAndAllowWhileIdle() 과 비슷하다.)



-

API 23 (6.0 MOS) 부터는 추가적인 파워 세이브 최적화가 추가되었다. Doze( 정지상태, unplug, idle device ) 와 App Standby ( unplugged, 최근 사용되지 않은 idle app ) 이 그 형태이다.

setAndAllowWhileIdle() 은 정확하지 않은 시간에, setExactAndAllowWhileIdle() 은 정확한 시간에 위의 power-saving mode 에서 alarm 을 작동시킬 수 있다.


일반적으로 사용하던 set() 이나 setExact() 를 사용하면 user 가 해당 power-saving mode 에서 돌아왔을 때에야 알람을 받을 수 있다.



-

single alarm 도 set() 으로 설정될 수 있다.

그러나 API 19+ (4.4 Kitkat) 이상을 targetting 하는 앱 부터는 single alarm 을 사용할 때 주의해야 한다.

system 이 해당 api 로 등록하는 alarm 을 inexact 이면서 다른 alarm 들과 함께 일괄 시작시키기 때문이다.


만약 start time 은 flexible 한데 deadline 은 꼭 지켜져야 한다면. setWindow() 를 써보자.


API 19+ (5.0 LOS) 부터는 setExact() 를 통해 정확한 시간에 alarm 을 fire 시킬 수 있다.

그러나 calendar reminder 와 같이 꼭 필요한 경우에만 사용하자.



-

alarm 을 반복적으로 수행시키고 싶다면, setInexactRepeating() 을 사용하는 것이 좋다. ( battery saving 효과 있음 )

API 19 (4.4 Kitkat) 이전에는 INTERNAL_HOUR 와 같은 INTERNAL_ 로 시작하는 constant 를 사용할 수 있었으나 API 19+ 부터는 모든 반복하는 alarm 이 setInexactRepeating 으로 작동한다. ( 어떤 INTERNAL 값이던지 )


setRepeating() 이라는 함수도 있는데, set() 비슷하게 API 19 (4.4 Kitkat) 부터는 inexact repeating 으로 작동한다. (setInexactRepeating 과 동일)


exact 반복 alarm 이 API 19+ 에서 필요하다면 setExact 을 통해 alarm 을 등록하고, 해당 alarm 이 수행되었을 때 다시 한번 setExact 를 수행해서 repeating 을 수동으로 수행해야 한다.



-

AlarmManager 를 위와 같이 사용하면 되지만, 꼭 AlarmManager 를 사용해야 하는지 한 번 생각해보자.

JobScheduler 가 API 21+ (5.0 LOS) 부터 사용 가능하고, 비슷한 기능이지만 compat 처럼 API 9+(2.3 GingerBread) 부터 사용 가능한 GcmNetworkManager 도 있다.


JobScheduler 와 GcmNetworkManager 는 주기적 일을 지원하지만 idle 로부터 깨어나는 것은 약하다.

그러나 network access, battery charging 과 같은 event 를 받아 job 을 수행할 수도 있고,

automatic backoff, retry, reboot 후에도 job 존재 등과 같은 장점들도 있다.

또한 battery save 측면에서 꽤 유용한 편이다.



-

어떤 Module 의 어떤 API 를 써야 할까?

alarm, alarm manager, alarm manager api, alarmmanager, alarmmanager powersave, app icon, App Standby, background work, battery save, compat, doze, Foreground, GCMNetworkManager, getnextalarmclock, idle app, idle device, internal_hour, jobscheduler, Scheduling, Set, setAlarmClock, setandallowwhileidle, setexact, setExactAndAllowWhileIdle, setinexactrepeating, setrepeating, setwindow, Stay, system ui, targetapi, unplug, Unplugged, [android] background work(AlarmManager) 수행에 대한 이야기



-

끝!




반응형

댓글