[번역] [Androd] Intelligent Job-Scheduling

Intelligent Job-Scheduling

최근의 앱들은 사용자 인터렉션의 직접적인 흐름외에, 비동기로 많은 작업들을 수행할 수 있다. 비동기 작업의 몇가지 예는 다음과 같다:
  • 네트워크 리소스의 업데이트
  • 정보의 다운로드
  • 백그라운드 작업의 업데이트
  • 시스템 서비스 호출의 스케쥴링
이 작업들을 현명하게 스케쥴링 하면, 배터리 수명과 같은 시스템 상태와 함께 앱 성능을 개선시킬 수 있다. JobScheduler가 이 스케쥴링 작업을 수행한다.
앱이 백그라운드 작업을 스케쥴 할 수 있게 해주는 몇개의 API가 있다 .이 옵션들 중 가장 중요한 것은 JobScheduler이다. 이 JobScheduler API를 사용하면 최적의 시스템 상태를 위해 단말에서 중앙집중형 작업 스케쥴링과 함께 작업실행에 강력한 조건을 지정할 수 있다.JobScheduler는 또한 확장성이 뒤어난 기능을 제공한다. 캐시지우기 같은 작은 작업에 적합할 뿐 아니라 DB를 클라우드에 동기화 시키는 것과 같은 대규모 작업에도 적합하다.
In addition to JobScheduler, there are several other facilities available to help your app schedule work. JobScheduler외에도, 앱의 스케쥴링을 돕는 아래와 같은 몇가지 기능이 있다.
이 페이지는 JobScheduler 및 앱의 성능과 시스템 상태를 최대로 하기 위해 작업 스케쥴링을 도와주는 다른 API들에 대해 간략히 소개한다.

Android Framework JobScheduler


JobScheduler는 작업을 스케쥴링하기 위한 Android 프레임워크 API이다. 이것은 Android 5.0 부터 사용가능했었고, 현재도 활발히 개발중이다. 특히 Android 7.0에서는 작업 기반 트리거 기능을 추가했다.
JobScheduler는 플랫폼에 구현되어 모든 앱에서 실행해야하는 작업에 대한 정보를 수집할 수 있다. 이 정보는 작업이 거의 유사한 시각에 실행하기 위한 스케쥴링에 사용된다. 이러한 방식으로 작업실행을 일괄처리 하게되면, 장치가 절전모드로 들어가서 좀 더 오래 있을 수 있으므로, 배터리 수명이 유지된다.
네트워크와 타이밍에 대한 요구사항을 지정해서 작업을 등록하여 JobScheduler를 사용한다. 그 후 적절한 시간에 작업이 정상적으로 실행되도록 일정을 계획한다. Doze 모드 및 앱 대기시간 제한을 준수하기 위해 동시에 필요에 따라 작업실행을 연기한다. JobScheduler는 작업실행 조건을 정의하기 위한 많은 Method를 제공한다.
만약 앱의 Target이 Android 5.0이라면, JobScheduler를 이용해 백그라운드 작업을 실행할 것을 권장한다. JobScheduler에 대한 좀 더 많은 정보는 API-reference documentation를 참고하라.

AlarmManager


AlarmManager API는 작업 스케쥴링을 위해 프레임 워크에서 제공하는 또 다른 옵션이다. 이 API는 앱이 특정 시간에 노티피케이션을 Post하거나, 알람을 설정하는 경우에 유용하다.
특정시간에 반드시 실행되어야 하는 작업의 경우에 대해서만 이 API를 사용해야 한다. 그러나 디바이스의 idle 혹은 충전중을 감지하는 것과 같은 JobScheduler에서 지정이 허용되는 실행 조건(execution conditions)에 대해서는 필요하지 않다.

Firebase JobDispatcher


Firebase JobDispatcher는 Android 플랫폼에서의 JobScheduler 와 유사한 기능을 제공하는 Open source library이다. Firebase JobDispatcher는 Android 5.0이하 버전(API level 21)을 대상으로 하는 앱의 JobScheduler 호환성 레이어 같은 역할을 한다. 
Firebase JobDispatcher는 작업의 dispatching (running)을 위한 구현으로 구글 플레이 서비스의 사용을 지원하지만, 라이브러리를 사용하면 다른 구현을 정의하고 사용할 수 있다. 예를들어 JobScheduler를 사용하거나, 당신의 커스텀 Code를 작성할 수 있다. 이러한 융통성으로 인해, 만약 앱의 Target Version이5.0보다 낮다면, Firebase JobDispatcher의 사용을 추천한다.
Firebase JobDispatcher에 관한 좀더 많은 정보는 문서와 소스코드를 참고하자.

Additional Facilities


위에서 설명된 API와 라이브러리들 외에도, 특정 조건에서 앱을 보다 강력하고 효과적으로 수행할 수 있는 Sync Adapter와 Service들이 있다.

SyncAdapter

프레임워크는 디바이스와 서버 사이의 데이터 싱크 작업을 관리하기 위한 SyncAdapter 클래스를 제공해 왔다. Sync adapter는 디바이스와 클라우드 사이의 데이터 싱크를 위해 특별히 디자인 되었다. Sync adapter들은 좀 더 복잡하다 구현하기가 위에 언급된 라이브러리나 API들보다는 구현하기가 좀 더 복잡하다. 왜냐하면 최소한의 Fake 인증(authenticator)과 content provider의 구현이 필요하기 때문이다. 이러한 이유로 일반적으로 백그라운드에서 오로지 클라우드와의 데이터 싱크를 위해 sync adapter를 생성하지 않아야 한다. 가능한 경우, JobSchedulerFirebase JobDispatcher, 또는 GCM Network Manager를 대신 사용해야 한다. 
Android N (API level 24)에서 SyncManager는 JobScheduler위에 위치한다. 만약 SyncManager가 제공하는 추가적인 기능이 필요한 경우에만 SyncAdapter를 사용해야 한다. 

Services

Services 프레임워크는 오래 실행되는 작업이 백그라운드에서 작동하도록 해준다. 음악재생같이 사용자를 위해 머물러 있어야 하는 작업을 수행하기 위해서 foreground Service를 사용하는 것을 권장한다. Bound service 또한 다양한 경우에 여전히 유용하다. 예를 들면, 사용자가 fragment나 activity를 볼 때만 실행될 필요가 있는 service등이 있다.
당신은 작업을 끊임없이 혹은 주기적으로 실행하기 위해 서비스를 시작하는 것을 회피해야 한다. 그런 작업들은 유용한 작업을 하고 있지 않더라도, 끊임없이 단말의 자원을 사용하기 때문이다. 대신에,  이 페이지에 기술된것이나 Native lifecycle 관리를 제공하는 다른 솔루션을 사용해야 한다. 서비스를 시작하는 것은 최후의 수단으로만 사용해라. Android 플랫폼은 앞으로 서비스를 시작하는 것을 지원하지 않을 수도 있다. 

Additional Points


Regardless of the solution you adopt, keep the following points in mind:
솔루션을 채택하는 것과 관계 없이, 아래 사항을 염두해야 한다. 
  • Captive Internet Portals, VPNs, 그리고 proxies는 인터넷 연결 문제를 일으킬 수 있다. 라이브러리나 API는 인터넷이 이용가능하다고 생각할 수 있다. 그러나 서비스는 접근 불가능할 수 있다. 정상적으로 실패하고, 가능한 적은 작업으로 다시 스케쥴링 하라.
  • 네트워크 가능여부 같이 작업을 실행하기 위해 지정한 상태에 따라, 태스크가 트리거 된 후 변경사항이 발생한다면 더이상 해당 컨디션이 충족되지 않는다. 이러한 경우 예기치 않게 반복적으로 작업이 실패할 수 있다. 이러한 이유로 당신은 백그라운드 작업로직을 코딩하여 작업이 지속적으로 실해할 경우 이를 알리고 실수로 리소스를 과도하게 사용하지 않도록 exponential back-off를 수행해야 한다.
  • 작업 스케쥴링을 할때(특히 AlarmManager를 사용 ) exponential backoff를 사용해야 한다. 만약 앱이 JobSchedulerFirebase JobDispatcher, 혹은 sync adapters를 사용한다면 exponential backoff는 자동으로 적용된다.

댓글

이 블로그의 인기 게시물

[Android] DataBinding의 동작방식 - 4. include Tag 혹은 ViewStub 사용시의 Binding

[Android] Retrofit2, OkHttpClient Method 정리

[Android] EventBus보다 빠르고 간단한 MessageBus !!