본문 바로가기
프로그래밍/Android

안드로이드 AlaramManager

by Daniel.kwak 2018. 12. 5.

안드로이드 백그라운드 작업

먼저 첫번째 분류로서 처리하는 작업의 실행 시점에 따라서 

1)당장 실행되어야 하거나

2)설정한 조건에 맞으면 실행이 되거나

로 나눌 수 있다.


두번째 분류는 작업의 결과가

1)항상 작업이 실행이 되어야 한다.

2)경우에 따라서 실행이 되지 않을 수 있다.


두 가지 기준에 따라서 



사분면으로 나눌 수 있다.

상황에 따라서 적절한 백그라운드 작업을 실행해야 한다. 


초기에 안드로이드의 백그라운드 작업은 어렵지 않았다. 개발자는 필요에 따라 브로드캐스트 리시버로 앱을 깨우는 것도 가능했고 iOS와 대비되는 차이점이기도 했다. 

그러나 장점이 높은만큼 앱들이 각자 백그라운드 작업을 돌린다면 안드로이드의 한정된 메모리와 CPU자원을 소모하게 되고, 안드로이드는 리눅스 커널과 다르게 스왑 공간이 없고 OOM으로 인해 앱을 죽이게 되므로 이는 곧 큰 문제로 이어지게 됐다. ( OOM 킬러는 소모된 메모리 양과 Visible상태에 기반하여 죽인다.) 


안드로이드의 모든 프로세스는 OOM_adj의 점수를 가지고 있고, 점수가 높을수록 OOM에 죽을 가능성이 높아진다.

따라서 중요한 건 앱이 메모리를 적게 소비할수록, 프로세스가 정리되지 않고 중요한 내용을 다룰 기회가 많아진다. 점차 백그라운드 작업은 발전하게 되었고 구글은 안드로이드 마쉬멜로우부터 도즈모드를 도입했다.


도즈모드란 스크린 화면을 끄면 진입하여 네트워크 통신, 동기화, GPS, 알림 등 백그라운드 작업들을 비활성화 시킨다. 이 도즈모드는 사용자가 스크린을 켜거나, 배터리에 충전을 시작할때까지 유지된다. 이러한 제약은 점차 강화되었고 API26(오레오) 부터 허가받지 않은 서비스를 start하면 IllegalStartException을 던진다. 


현재 목표는 매일 같은 시간대에 데이터베이스 내용을 UPDATE 하여 필요시 UI업데이트 (progress Bar를 띄우는 등)를 해주는 것이므로 AlaramManager와 BroadcastReceiver를 적용한다. 


(단, AlarmManager도 API19부터는 set함수가 정확하게 동작하지 않을 수도 있다. )


안드로이드 AlaramManager

특정 시간대에 어떤 작업을 수행시키기 위해서는 먼저 고려해야할 네 가지 사항이 있다.

  • 어떤 시간을 기준으로 하는가?
->실제시간으로 할지, 단말기가 시작된 이후로 소요된 시간으로 할지에 대해서 정할 수 있다.
  • 단말기가 대기모드일 때도 작업을 수행할 것인가?
->단말기가 대기상태일 때 단말기를 깨울것인지, 대기모드일 때는 수행하지 않을지 결정한다. 위의 두 가지 사항을 고려해서 네 가지 모드를 설정할 수 있다.
1)AlarmManager.ELAPSED_REALTIME : 단말기가 부팅된 이후 경과된 시간을 기준으로 한다.
2)AlarmManager.ELAPSED_REALTIME_WAKEUP :  위와 동일하며 단말기를 활성상태로 전환 후 작업을 수행한다.
3)AlarmManager.RTC : 실제 시간을 기준으로 작업을 수행한다.
4)AlarmManager.RTC_WAKEUP : 위와 동일하며 단말기를 활성상태로 만들고 작업을 수행한다.

  • 한 번 수행하고 끝나는 일회성인지, 반복해서 수행하는 반복성인지
  • 정확한 시간에 수행되어야 하는가? 아니면 오차의 범위가 있어도 상관 없는가?
정확한 시간에 수행을 원하면 배터리의 소요가 증가하므로 신중하게 결정한다. 


public void set(int type , long triggerAtTime , PendingIntent operation) 

-한 번만 수행되는 알람을 예약한다. 
-type은 위에서 적은 알람의 속성을 적용한다.
-triggerAtTime은 type에 따라서 적용값이 달라진다. 
-operation에는 실행할 작업을 지정한다.


public void setRepeating(int type , long triggerAtTime , long interval , PendingIntent opration)

-set 함수와 동일하며, interval에는 작업을 실행할 간격에 대해서 명시한다.


public void setInexactRepeating(int type , long triggerAtTime , long interval , PendingIntent operation)

- 배터리의 소모를 아끼기 위해 정확한 시간대에 작업할 필요가 없으면 이 함수를 사용한다.


위에서 적은대로 API 19 부터는 set함수의 정확성을 보장할 수가 없으므로, 

setExact(int type , long triggerAtTime , PendingIntent operation) 을 사용하여 정확한 시간에 보장이 되도록 설정한다. 



'프로그래밍 > Android' 카테고리의 다른 글

안드로이드의 구조 - MVC , MVP , MVVM  (0) 2018.12.06
안드로이드 방향 전환  (0) 2018.12.06
안드로이드 컴포넌트  (0) 2018.12.06
Android Material CalendarView  (1) 2018.12.05
안드로이드 Camera의 영상 출력하기  (0) 2018.12.05
Android SurfaceView  (0) 2018.12.04