Android 12 (API 수준 31) 이상을 타겟팅하는 앱은 몇 가지 특수한 사례를 제외하고 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작할 수 없습니다. 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작하려고 하지만 포그라운드 서비스가 예외 사례 중 하나를 충족하지 못하면 시스템에서 ForegroundServiceStartNotAllowedException
이 발생합니다.
또한 앱이 사용 중 권한 (예: 생체 신호 센서, 카메라, 마이크 또는 위치 권한)이 필요한 포그라운드 서비스를 실행하려는 경우 앱이 백그라운드 시작 제한 예외에 해당하더라도 앱이 백그라운드에 있는 동안 서비스를 생성할 수 없습니다. 이에 관한 이유는 사용 중 권한이 필요한 포그라운드 서비스 시작 제한 섹션에 설명되어 있습니다.
백그라운드 시작 제한의 예외
다음 상황에서는 앱이 백그라운드에서 실행되는 동안에도 포그라운드 서비스를 시작할 수 있습니다.
- 앱이 활동과 같은 사용자에게 표시되는 상태에서 전환됩니다.
- 앱은 백그라운드에서 활동을 시작할 수 있습니다. 단, 앱이 기존 작업의 백 스택에 활동을 보유한 경우는 예외입니다.
앱이 Firebase 클라우드 메시징을 사용하여 우선순위가 높은 메시지를 수신합니다.
사용자가 앱과 관련된 UI 요소에서 작업을 실행합니다. 예를 들어 대화창이나 알림, 위젯, 활동과 상호작용할 수 있습니다.
앱이 정확한 알람을 호출하여 사용자가 요청한 작업을 완료합니다.
앱이 기기의 현재 입력 방법입니다.
기기가 재부팅되고 broadcast receiver에서
ACTION_BOOT_COMPLETED
나ACTION_LOCKED_BOOT_COMPLETED
,ACTION_MY_PACKAGE_REPLACED
인텐트 작업을 수신한 후의 경우입니다.앱이 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