Android 12 (API 수준 31) 이상을 타겟팅하는 앱은 몇 가지 특수한
사례를 제외하고 앱이 백그라운드에서 실행되는 동안 포그라운드
서비스를 시작할 수 없습니다. 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작하려고 하지만 포그라운드 서비스가 예외 사례 중 하나를 충족하지 못하면 시스템에서
ForegroundServiceStartNotAllowedException이 발생합니다.
또한 앱이 사용 중 권한 (예: 신체 센서, 카메라, 마이크 또는 위치 권한)이 필요한 포그라운드 서비스를 실행하려는 경우 앱이 백그라운드 시작 제한의 예외 중 하나에 해당하더라도 앱이 백그라운드에 있는 동안 서비스를 만들 수 없습니다. 이유는 사용 중 권한이 필요한 포그라운드 서비스 시작 제한 섹션에 설명되어 있습니다.
백그라운드 시작 제한의 예외
다음 상황에서는 앱이 백그라운드에서 실행되는 동안에도 포그라운드 서비스를 시작할 수 있습니다.
- 앱이 활동과 같은 사용자에게 표시되는 상태에서 전환됩니다.
- 앱은 백그라운드에서 Activity를 시작할 수 있습니다. 단, 앱이 기존 태스크의 백 스택에 Activity를 보유한 경우는 예외입니다.
앱이 Firebase 클라우드 메시징을 사용하여 우선순위가 높은 메시지를 수신합니다.
사용자가 앱과 관련된 UI 요소에서 작업을 실행합니다. 예를 들어 대화창이나 알림, 위젯, 활동과 상호작용할 수 있습니다.
앱이 정확한 알람을 호출하여 사용자가 요청한 작업을 완료합니다.
앱이 기기의 현재 입력 방법입니다.
기기가 재부팅되고
ACTION_BOOT_COMPLETED,ACTION_LOCKED_BOOT_COMPLETED, 또는ACTION_MY_PACKAGE_REPLACED인텐트 작업을 broadcast receiver에서 수신한 후의 경우입니다.앱이 broadcast receiver에서
ACTION_TIMEZONE_CHANGED나ACTION_TIME_CHANGED, 또는ACTION_LOCALE_CHANGED인텐트 작업을 수신합니다.앱이
NfcService에서ACTION_TRANSACTION_DETECTED이벤트를 수신합니다.앱에서 호환 기기 관리도구를 사용하고
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND권한 또는REQUEST_COMPANION_RUN_IN_BACKGROUND권한을 선언합니다. 가능하면REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND를 사용하세요.사용자가 앱의 배터리 최적화를 사용 중지합니다.
앱에
SYSTEM_ALERT_WINDOW권한이 있습니다. 참고: 앱이 Android 15 이상을 타겟팅하는 경우SYSTEM_ALERT_WINDOW권한이 있어야 하며 앱에 현재 표시되는 오버레이 창이 있어야 합니다.
사용 중 권한이 필요한 포그라운드 서비스 시작 제한
Android 14 (API 수준 34) 이상에서는 사용 중 권한이 필요한 포그라운드 서비스를 시작하는 경우 알아야 할 특별한 상황이 있습니다.
앱이 Android 14 이상을 타겟팅하는 경우 운영체제는 포그라운드 서비스를 만들 때 앱에 해당 서비스 유형에 적합한 모든 권한이 있는지 확인합니다. 예를 들어 마이크 유형의
포그라운드 서비스를 만들 때 운영체제는 앱에 현재
RECORD_AUDIO
권한이 있는지 확인합니다. 이 권한이 없으면 시스템에서
SecurityException이 발생합니다.
사용 중 권한의 경우 이로 인해 문제가 발생할 수 있습니다. 앱에 사용 중 권한이 있는 경우 포그라운드에 있는 동안에만 해당 권한이 있습니다. 즉, 앱이 백그라운드에 있고 카메라, 위치 또는 마이크 유형의 포그라운드 서비스를 만들려고 하면 시스템에서 앱에 필요한 권한이 현재 없음을 확인하고 SecurityException이 발생합니다.
마찬가지로 앱이 백그라운드에 있고 BODY_SENSORS 권한이 필요한 건강 관리 서비스를 만드는 경우 앱에 현재 해당 권한이 없으며 시스템에서 예외가 발생합니다.
(이는 다른 권한이 필요한 건강 관리 서비스에는 적용되지 않습니다.
예: ACTIVITY_RECOGNITION.) 호출
PermissionChecker.checkSelfPermission()
해도 이 문제가 발생하지 않습니다. 앱에 사용 중 권한이 있고 checkSelfPermission()을 호출하여 해당 권한이 있는지 확인하는 경우 앱이 백그라운드에 있더라도 메서드는 PERMISSION_GRANTED를 반환합니다. 메서드가 PERMISSION_GRANTED를 반환하면 '앱이 사용 중인 동안 이 권한이 있습니다'라고 말하는 것입니다.
따라서 포그라운드 서비스에 사용 중 권한이 필요한 경우 서비스가
정의된 예외 중 하나에 해당하지 않는 한 앱에 표시되는 활동이 있는 동안 Context.startForegroundService() 또는 Context.bindService()를 호출해야 합니다.
사용 중 권한 제한의 예외
경우에 따라 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스가 시작되더라도 앱이 포그라운드에서 실행되는 동안('사용 중') 위치, 카메라, 마이크 정보에 계속 액세스할 수 있습니다.
이러한 상황에서 서비스가 포그라운드 서비스
유형을 location 선언하고
ACCESS_BACKGROUND_LOCATION
권한이 있는 앱에 의해 시작되면 이 서비스는 앱이 백그라운드에서 실행되는 경우에도 항상 위치 정보에 액세스할 수 있습니다.
다음 목록에는 이러한 상황이 포함되어 있습니다.
- 시스템 구성요소가 서비스를 시작합니다.
- 서비스가 앱 위젯과의 상호작용으로 시작됩니다.
- 서비스가 알림과의 상호작용으로 시작됩니다.
- 서비스가 표시된 다른 앱에서 전송된
PendingIntent로 시작됩니다. - 서비스가 기기 소유자 모드로 실행되는 기기 정책 컨트롤러인 앱에 의해 시작됩니다.
- 서비스가
VoiceInteractionService를 제공하는 앱에 의해 시작됩니다. - 서비스가
START_ACTIVITIES_FROM_BACKGROUND권한이 있는 앱에 의해 시작됩니다.
앱에서 영향을 받는 서비스 확인
앱을 테스트할 때 포그라운드 서비스를 시작합니다. 시작된 서비스에 위치, 마이크 및 카메라 액세스 제한이 적용된 경우 다음 메시지가 Logcat에 표시됩니다.
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME