Ограничения по времени для активных служб

Если приложение предназначено для 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]"

Чтобы избежать проблем, связанных с этим изменением, вы можете сделать следующее:

  1. Реализуйте в своем сервисе новый метод Service.onTimeout(int, int). Когда приложение получит обратный вызов, вызовите stopSelf() в течение нескольких секунд. Если вы не остановите приложение сразу, система сгенерирует ошибку.
  2. Убедитесь, что службы dataSync и mediaProcessing вашего приложения не работают дольше 6 часов в течение 24-часового периода (если пользователь не взаимодействует с приложением, сбрасывая таймер).
  3. Запускайте активные службы dataSync или mediaProcessing только в результате прямого взаимодействия с пользователем. Поскольку приложение находится на переднем плане, когда служба запускается, у нее есть полные шесть часов после того, как приложение перейдет в фоновый режим.
  4. Вместо активных служб используйте альтернативный 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