Android Background 동작 처리하기

읽기 전

  • 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
  • 개인적으로 사용해보면서 배운 점을 정리한 글입니다.
  • 전체 프로젝트 코드는 깃헙 링크 - MyNotification에 올려두겠습니다. 참고해주세요.

앱을 종료하거나 최근 사용목록에서 지우더라도 알림은 안정적으로 사용자에게 도달해야 한다면 몇 가지 고려사항이 있다. 예전부터 관련 방법이 여러가지 있었으나 안드로이드 정책이 사용자를 위해 과도한 백그라운드 작업을 억제하는 방향으로 가면서 제약이 점점 늘어나고 있다. 최근에는 WorkManager로 통합되는 추세이지만 구현하고자 하는 기능을 제대로 정리한 글을 찾기 힘들어 이번 기회에 정리해보려고 한다.

안드로이드 백그라운드 푸시알림을 위한 방법

AlarmManager & BroadcastReceiver & Service

현재 안드로이드에서 사용할 수 있는 방법 중 가장 정밀하게 시간 이벤트를 다룰 수 있다. AlarmManager로 특정 시간을 설정하고 BroadcastReceiver로 app 종료 및 기기 리부팅 등 앱 외적인 이벤트를 receive하여 안정성을 높이고 Service에 등록하여 백그라운드 작업을 처리하게 함으로써 의도된 기능을 수행한다. 그러나 OS 업데이트가 점점 진행되면서 제약이 생긴다. 그리고 무엇보다 최근 목록에서 앱을 kill하면 AlarmManager가 clear되는 바람에 Job 사용이 강제되었다.

JobScheduler

AlarmManager 대안으로 나온 개념으로 사실상 WorkManager의 전신이라고 보면 된다. 다만 WorkManager가 나오면서 구현이 편의성이 있어 대체되고 있다. 지원하는 api 레벨의 호환성이 맞지 않아 예전에는 AlarmManager를 혼용하여 개발해야 하는 문제점이 있었다.

JobDispatcher

Firebase 기반인데 내장 모듈에 플레이 서비스가 있어 중국계 및 구글 플레이 서비스를 사용하지 않는 기기에서의 적용이 불가능했다.

GCM & FCM

네트워크 기반 푸시 알림 서비스다. 네트워크만 연결되어 있다면 원하는 기능을 서버에서 구현한 뒤 배포하면 되기 때문에 많이 이용되고 있다. 최근 GCM의 deprecated 판정에 따라 FCM을 권장하고 있다. 다른 포스팅에서도 FCM을 정리한 글이 대다수이다. 그러나 배포하고자 하는 앱이 오프라인에서도 작동하여 오프라인 환경에서 사용자에게 정보를 제공하고자 한다면 다른 방법을 고려해야 한다.

WorkManager

GCM, JobDispatcher 등이 deprecated 판정을 받고 백그라운드 제약을 더욱 업격이 하며 real-time task는 foreground로 넣으라고 강요함에 따라 개발자들은 thread에 sleep값을 주는 등 우회적인 방법을 통해 죽지않는 서비스를 구현하고 있다. (사용자 입장에서는 솔직히 바이러스라고 봐도 무방한 미친 짓이다.) 구글은 개발자들의 수요에 맞춰 WorkManager를 제공하는데 특정 api이하에서는 AlarmManager 기반으로, 그보다 높으면 JobScheduler를 사용하여 기존 호환문제를 함께 해결하였다.

결론

최근 Min SDK Version을 21 정도로 올리는 추세라 호환에 대한 걱정은 덜어도 된다. 네트워크 연결 환경에서의 정상적인 앱 동작, 알림 전송을 원하면 FCM, 앱이 활성화된 상태에서 짧은 시간 내로 알림을 정확하게 보낼 때는 AlarmManager, 오프라인 환경에서 안정적인 백그라운드 작업을 통해 알림을 전송하고 싶으면 WorkManager를 채택하면 되겠다.

+ Recent posts