안드로이드를 개발하다 보면 Background와 Foreground라는 단어를 접하게 됩니다.
이 두가지 개념을 잘 알고 있어야 하며 개발 시 너무도 많이 개발자와 싸우게 될 단어입니다.
안드로이드 앱은 기본적으로 액티비티, 서비스, 브로드캐스트 리시버, 콘텐츠 프로바이더 등
4개의 컴포넌트로 구성되는데 액티비티를 제외한 나머지 컴포넌트는 화면을 구현하는 용도가
아니라 백그라운드에서 작업을 처리할 목적으로 사용합니다.
예전에는 사용자가 앱을 실행해 화면이 출력된 적이 없는 상황에서도 서비스나 브로드캐스트
리시버로 백그라운드에서 작업을 처리할 수 있었지만 안드로이드 8버젼부터는 제약이 생겼습니다.
1) 리시버 백그라운드 제약
브로드캐스트 리시버의 백그라운드 제약은 sendBroadcast()함수로 인텐트를 시스템에 전달함에 있어
암시적 인텐트로는 실행 할 수 없다는 것입니다.
예를 들어 암시적 인텐트는 다음과 같이 실행할 수 있습니다.
val intent = Intent("ACTION_RECEIVER")
sendBroadcast(intent)
하지만 위와같이 실행하면 리시버는 실행되지 않고 오류가 발생하게 됩니다.
즉 백그라운드 제약이 생겨남에 따라 오류가 발생하는 것입니다.
리 비버를 실행하는 방법은 매니페스트에 등록하지 않고 registerReceiver() 함수로 실행하는 것입니다.
registerReceiver(receiver, IntentFilter("ACTION_OUTER_DYNAMIC_RECEIVER"))
정리하면 매니페스트에 등록한 리시버를 암시적으로 실행할 때에는 어떤 리시버에서도 실행되지 않습니다.
2) 서비스 백그라운드 제약
서비스는 앱이 백그라운드 상태일 때 인텐트를 전달하면 오류가 발생합니다.
안드로이드 시스템에서 앱이 슬립모드에 진입할 때 백그라운드가 전부 제약을 받으므로
앞으로는 포그라운드 서비스를 이용해 구현해야 합니다.
안드로이드 시스템에서 서비스가 정상으로 실행되는 포그라운드 상황은 다음과 같습니다.
이 상황을 제외한 경우는 백그라운드 상황으로 간주됩니다.
하지만 백그라운드 상황이 아니더라도 다음의 예외상황에서는 서비스가 정상적으로 동작합니다.
하지만 이러한 상황을 다 제외하고 서비스를 startForegroundService()를 통해 실행하면
아무런 제약 없이 앱이 슬립 상황에 들어가도 실행하게 됩니다.
주의해야 할 점은 startForegroundService를 실행하고 나서 startForeground() 함수를 반드시
호출해 주어야 오류가 발생하지 않습니다.
Foreground로 앱을 실행하면 시스템 알림이라 그런지 앱의 아이콘에 1이 표시됩니다.
이 알림을 없애는 방법은 알림리스트에서 해당 앱을 왼쪽으로 밀어 설정에서 해제해주면
Foregorund는 실행되지만 해당 앱 아이콘에 1은 사라지게 됩니다.
'안드로이드' 카테고리의 다른 글
[Android] Lint found fatal errors 해결 (0) | 2021.12.27 |
---|---|
[Android] SDK location not found 에러 해결 (0) | 2021.11.12 |
[Android] 데이터 저장 SharedPreferences (0) | 2021.10.20 |
[Android] 핸들러란? (0) | 2021.10.13 |
[Android] Foreground (0) | 2021.10.11 |
댓글