지금까지의 백그라운드 작업 방법
안드로이드는 앱의 실행 및 종료 여부에 상관없이 수행되는 백그라운드 작업을 다음과 같이 처리해왔습니다.
기본은 AlarmManager 와 브로드캐스트 리시버를 사용하는 것입니다.
AlarmManager 의 명세대로 우리가 지정한 타이밍에 딱 시스템에서는 알람이 오고, 이 알람에 맞춰서 백그라운드 작업을 수행하면 됐습니다만, 안드로이드 K (킷켓, API 19) 부터는 알람이 한없이 미뤄지거나 한번에 몰아서 처리되는 등 정확한 실행을 보장하지 않게 되었습니다.
안드로이드는 브로드캐스트 리시버 를 등록하여 기기의 부팅시나 네트워크 연결 등의 상황에 시스템으로부터 전파되는 알림을 받을수 있습니다.
앱은 자신이 원하는 상황의 브로드캐스트 리시버를 통해 해당 타이밍에 작업을 수행해 왔지만, 안드로이드 N (누가, API 24) 에서 특정 인텐트에 대한 동작이 제한이 되고, 안드로이드 O (오레오, API 26) 에서는 암시적 브로드캐스트 리시버의 등록을 차단하는 등 점점 사용 방법에 제한이 추가되고 있습니다.
안드로이드 L (롤리팝, API 21) 에서 JobScheduler 를 제공합니다. 부정확해진 AlarmManger 의 대안이기도 했고, 결국 백그라운드 작업을 아예 배제시킬수는 없었기 때문입니다. 하지만, 이로서 안드로이드 L 이전 버전에서도 동작해야 하는 앱 의 개발자는 버전에 따라 AlarmManager 와 JobScheduler 를 각각 사용하도록 구현해야 하는 이중고를 겪어야 했습니다.
이후 구글은 Firebase JobDispatcher 를 제공합니다. Firebase JobDispatcher 는 안드로이드 G(진저브레드, API 9) 이상을 지원하고 내부적으로 현재 시스템의 안드로이드 버전에 따라 AlarmManager 와 JobScheduler 를 알아서 선택합니다.
개발자의 일은 한가지로 줄었으나, JobDispatcher 는 구글 플레이 서비스 에 의존성을 가집니다. 그러므로 구글 플레이 서비스를 사용할수 없는 앱 들은 결국 AlarmManager 또는 JobScheduler 를 직접 구현하는 수 밖에 없습니다. 또한 두가지 방식을 모두 호환하는 방식으로 api 를 제공하다보니 할수 있는 작업이 매우 제한적이었습니다.