안드로이드 백그라운드 작업
먼저 첫번째 분류로서 처리하는 작업의 실행 시점에 따라서
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
특정 시간대에 어떤 작업을 수행시키기 위해서는 먼저 고려해야할 네 가지 사항이 있다.
- 어떤 시간을 기준으로 하는가?
- 단말기가 대기모드일 때도 작업을 수행할 것인가?
- 한 번 수행하고 끝나는 일회성인지, 반복해서 수행하는 반복성인지
- 정확한 시간에 수행되어야 하는가? 아니면 오차의 범위가 있어도 상관 없는가?
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 |