Android 컴포넌트 백그라운드 제약

timothy jeong·2021년 11월 15일
0

Android with Kotlin

목록 보기
44/69

안드로이드 앱은 4개의 주요 컴포넌트로 구성된다. 그런데 액티비티를 제외한 나머지 컴포넌트는 화면을 구현하는 용도가 아니라 백그라운드에서 작업을 처리할 목적으로 사용한다.

예전에는 사용자가 앱을 실행해 화면이 출력된 적이 없는 상황에서도 서비스나 브로드캐스트 리시버로 백그라운드에서 작업을 처리할 수 있었지만, API 레벨 26 부터는 제약을 받는다. 따라서 브로드캐스트 리시버나 서비스를 이용할 때는 백그라운드 제약에 관해 잘 알아둬야 한다.

브로드캐스트 리시버 백그라운드 제약

브로드캐스트 리시버를 실행하려면 sendBraodcast() 함수로 인텐트를 시스템에 전달해야 한다. 그런데 브로드캐스트 리시버는 암시적 인텐트로 실행할 수 없다. 만약 암시적으로 실행하려고 한다면 Background execution not allowed 에러가 나온다. 그런데 메니페스트에 등록하지 않고 코드에서 동적으로 registerReceiver 로 등록하면 암시적 인텐트로도 잘 실행된다.

메니페스트에 등록한 리시버를 암시적을 실행할 때는 같은 앱의 리시버든 외부 리시버든 실행되지 않는다.

서비스 백그라운드 제약

서비스는 앱이 백그라운드 상태일 때 인텐트를 전달하면 오류가 발생한다. 포그라운드 상황에서는 잘 실행되던 인텐트도 백그라운드 상황에서는 Not allowed to start service Intent 에러가 발생한다. 포그라운드 상황이라는 것을 조금 더 엄실하게 살펴보자면 다음과 같다.

  • 포그라운드 서비스가 있을 때
  • 액티비티가 시작되든 일시 중지되든 상관없이 보이는 액티비티가 있을 때
  • 앱의 서비스에 바인딩하거나 앱의 콘텐츠 프로바이더를 사용해 또 다른 포그라운드 앱이 연결되었을 때

이러한 상황 이외는 모두 백그라운드 상황으로 간주한다. 또한 앱이 백그라운드에 있는 상황일지라도 아래의 경우는 서비스가 정상으로 실행된다.

  • 우선순위가 높은 파이어베이스 클라우드 메시징(FCM)처리
  • SMS/MMS 메시지와 같은 브로드캐스트 수신
  • 알림에서 PendingIntent 실행
  • VPN 앱이 포그라운드로 승격되기 전에 VpnService 시작

백그라운드에 있는 앱의 서비스를 이용하는 함수가 있다.

startForegroundService()인데, 이 함수를 쓰고 나서는 곧바로 앱을 포어그라운드 상태로 만들지 않으면 다시 에러가 나오고 만다.

profile
개발자

0개의 댓글