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

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

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

백그라운드 시작 제한의 예외

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

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

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