포그라운드 서비스 시간 초과

앱이 Android 15 이상을 타겟팅하는 경우 시스템은 앱이 백그라운드에 있는 동안 특정 포그라운드 서비스가 실행될 수 있는 시간에 제한을 적용합니다. 현재 이 제한은 dataSyncmediaProcessing 포그라운드 서비스 유형 포그라운드 서비스에만 적용됩니다. shortService 포그라운드 서비스 유형에는 더 제한적인 한도가 적용되며, 이 한도는 해당 서비스 유형의 문서에서 설명합니다.

제한 시간 동작

시스템은 dataSyncmediaProcessing 포그라운드 서비스가 24시간 동안 총 6시간 동안 실행되도록 허용합니다. 그 후에는 실행 중인 서비스의 Service.onTimeout(int, int) 메서드(Android 15에서 도입됨)를 호출합니다. mediaProcessing 포그라운드 서비스 유형은 Android 15에 추가되었습니다. 6시간 시간 제한은 dataSync 서비스와 mediaProcessing 서비스에서 별도로 추적됩니다. 예를 들어 dataSync 서비스가 1시간 동안 실행된 경우 앱은 mediaProcessing 포그라운드 서비스에 5시간만 사용할 수 있지만 dataSync 서비스에는 6시간을 사용할 수 있습니다.

포그라운드 서비스가 6시간 제한에 도달하면 서비스는 Service.stopSelf()를 호출할 수 있는 몇 초의 시간이 있습니다. 시스템이 Service.onTimeout()를 호출하면 서비스가 더 이상 포그라운드 서비스로 간주되지 않습니다. 서비스가 Service.stopSelf()를 호출하지 않으면 시스템에서 내부 예외를 발생시킵니다. 예외는 다음 메시지와 함께 Logcat에 로깅됩니다.

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

이 동작 변경으로 인한 문제를 방지하려면 다음 중 하나 이상을 수행하세요.

  1. 서비스에서 새 Service.onTimeout(int, int) 메서드를 구현하도록 합니다. 앱이 콜백을 수신하면 몇 초 이내에 stopSelf()를 호출해야 합니다. 앱을 즉시 중지하지 않으면 시스템에서 실패를 생성합니다.
  2. 앱의 dataSyncmediaProcessing 서비스가 24시간 동안 총 6시간 넘게 실행되지 않도록 합니다 (사용자가 앱과 상호작용하여 타이머를 재설정하는 경우 제외).
  3. 직접적인 사용자 상호작용의 결과로만 dataSync 또는 mediaProcessing 포그라운드 서비스를 시작합니다. 서비스가 시작될 때 앱이 포그라운드에 있으므로 앱이 백그라운드로 전환된 후 6시간 동안 서비스가 계속 실행됩니다.
  4. 이러한 포그라운드 서비스를 사용하는 대신 WorkManager와 같은 대체 API를 사용하세요. 특히 dataSync 포그라운드 서비스를 사용하는 대신 대체 API를 사용하는 것이 좋습니다.

앱의 dataSync 포그라운드 서비스가 지난 24시간 동안 6시간 동안 실행되었다면 사용자가 앱을 포그라운드로 전환하여 타이머를 재설정하지 않는 한 다른 dataSync 포그라운드 서비스를 시작할 수 없습니다. 다른 dataSync 포그라운드 서비스를 시작하려고 하면 시스템에서 '포그라운드 서비스 유형 dataSync의 시간 제한이 이미 소진됨'과 같은 오류 메시지와 함께 ForegroundServiceStartNotAllowedException를 발생시킵니다.

테스트

앱 동작을 테스트하려면 앱이 Android 15를 타겟팅하지 않더라도 (앱이 Android 15 기기에서 실행되는 경우) 데이터 동기화 시간 제한을 사용 설정할 수 있습니다. 제한 시간을 사용 설정하려면 다음 adb 명령어를 실행합니다.

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

제한에 도달할 때 앱이 어떻게 동작하는지 더 쉽게 테스트할 수 있도록 제한 시간도 조정할 수 있습니다. dataSync 포그라운드 서비스의 새로운 제한 시간을 설정하려면 다음 adb 명령어를 실행합니다.

adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds

mediaProcessing 포그라운드 서비스의 새로운 제한 시간을 설정하려면 다음 명령어를 실행합니다.

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds