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 이상을 타겟팅하는 경우 운영체제는 포그라운드 서비스를 만들 때 앱에 해당 서비스 유형에 적합한 모든 권한이 있는지 확인합니다. 예를 들어 microphone 유형의 포그라운드 서비스를 만들면 운영체제는 앱에 현재 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