Если приложение предназначено для Android 15 или более поздней версии, система ограничивает время работы некоторых активных служб, пока приложение находится в фоновом режиме. В настоящее время это ограничение распространяется только на активные службы типов dataSync и mediaProcessing. Для активных служб типа shortService действуют более строгие ограничения, которые описаны в документации.
Поведение при тайм-ауте
Система позволяет активным службам dataSync и mediaProcessing работать в общей сложности шесть часов в течение 24-часового периода, после чего вызывает метод Service.onTimeout(int, int) работающей службы (появился в Android 15). Тип активной службы mediaProcessing был добавлен в Android 15. Шестичасовое ограничение отслеживается отдельно для сервисов dataSync и mediaProcessing. Например, если служба dataSync работала один час, то для активных служб dataSync у приложения останется пять часов, а для служб mediaProcessing – шесть.
Когда активная служба достигает шестичасового лимита, у нее есть несколько секунд, чтобы вызвать 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]"
Чтобы избежать проблем, связанных с этим изменением, вы можете сделать следующее:
- Реализуйте в своем сервисе новый метод
Service.onTimeout(int, int). Когда приложение получит обратный вызов, вызовитеstopSelf()в течение нескольких секунд. Если вы не остановите приложение сразу, система сгенерирует ошибку. - Убедитесь, что службы
dataSyncиmediaProcessingвашего приложения не работают дольше 6 часов в течение 24-часового периода (если пользователь не взаимодействует с приложением, сбрасывая таймер). - Запускайте активные службы
dataSyncилиmediaProcessingтолько в результате прямого взаимодействия с пользователем. Поскольку приложение находится на переднем плане, когда служба запускается, у нее есть полные шесть часов после того, как приложение перейдет в фоновый режим. - Вместо активных служб используйте альтернативный API, например WorkManager. В частности, вместо
dataSyncактивной службы можно использовать альтернативный API.
Если активные службы dataSync работали в течение шести часов за последние 24 часа, вы не сможете запустить ещё одну активную службу dataSync, если пользователь не переведет приложение в активный режим (это сбросит таймер). Если вы попытаетесь запустить другую dataSync активную службу, система выдаст ForegroundServiceStartNotAllowedException с сообщением об ошибке "Time limit already exhausted for foreground service type dataSync".
Тестирование
Чтобы протестировать поведение приложения, вы можете включить тайм-ауты синхронизации данных, даже если приложение не предназначено для 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