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