백그라운드에서 포그라운드 서비스 시작 시 제한사항

Android 12 (API 수준 31) 이상을 타겟팅하는 앱은 몇 가지 특별한 사례를 제외하고 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작할 수 없습니다. 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작하려고 하지만 포그라운드 서비스가 예외 사례 중 하나를 충족하지 않으면 시스템에서 ForegroundServiceStartNotAllowedException이 발생합니다.

또한 앱이 사용 중에만 권한 (예: 생체 신호 센서, 카메라, 마이크 또는 위치 정보 액세스 권한)이 필요한 포그라운드 서비스를 실행하려는 경우 앱이 백그라운드 시작 제한의 예외 중 하나에 해당하더라도 앱이 백그라운드에 있는 동안에는 서비스를 만들 수 없습니다. 그 이유는 사용 중 권한이 필요한 포그라운드 서비스 시작 제한사항 섹션에 설명되어 있습니다.

백그라운드 시작 제한 예외

다음과 같은 상황에서는 앱이 백그라운드에서 실행되는 동안에도 포그라운드 서비스를 시작할 수 있습니다.

사용 중 권한이 필요한 포그라운드 서비스 시작 제한

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