안드로이드 앱은 4개의 주요 컴포넌트로 구성된다. 그런데 액티비티를 제외한 나머지 컴포넌트는 화면을 구현하는 용도가 아니라 백그라운드에서 작업을 처리할 목적으로 사용한다.
예전에는 사용자가 앱을 실행해 화면이 출력된 적이 없는 상황에서도 서비스나 브로드캐스트 리시버로 백그라운드에서 작업을 처리할 수 있었지만, API 레벨 26 부터는 제약을 받는다. 따라서 브로드캐스트 리시버나 서비스를 이용할 때는 백그라운드 제약에 관해 잘 알아둬야 한다.
브로드캐스트 리시버를 실행하려면 sendBraodcast() 함수로 인텐트를 시스템에 전달해야 한다. 그런데 브로드캐스트 리시버는 암시적 인텐트로 실행할 수 없다. 만약 암시적으로 실행하려고 한다면 Background execution not allowed 에러가 나온다. 그런데 메니페스트에 등록하지 않고 코드에서 동적으로 registerReceiver 로 등록하면 암시적 인텐트로도 잘 실행된다.
메니페스트에 등록한 리시버를 암시적을 실행할 때는 같은 앱의 리시버든 외부 리시버든 실행되지 않는다.
서비스는 앱이 백그라운드 상태일 때 인텐트를 전달하면 오류가 발생한다. 포그라운드 상황에서는 잘 실행되던 인텐트도 백그라운드 상황에서는 Not allowed to start service Intent 에러가 발생한다. 포그라운드 상황이라는 것을 조금 더 엄실하게 살펴보자면 다음과 같다.
이러한 상황 이외는 모두 백그라운드 상황으로 간주한다. 또한 앱이 백그라운드에 있는 상황일지라도 아래의 경우는 서비스가 정상으로 실행된다.
백그라운드에 있는 앱의 서비스를 이용하는 함수가 있다.
startForegroundService()인데, 이 함수를 쓰고 나서는 곧바로 앱을 포어그라운드 상태로 만들지 않으면 다시 에러가 나오고 만다.