Если приложение предназначено для Android 15 или более поздней версии, система накладывает ограничения на продолжительность работы некоторых приоритетных служб, пока приложение находится в фоновом режиме. В настоящее время это ограничение применяется только к приоритетным службам типа dataSync
и mediaProcessing
. Для приоритетного типа службы shortService
действуют более строгие ограничения, которые описаны в документации по этому типу службы.
Поведение тайм-аута
Система позволяет активным службам dataSync
и mediaProcessing
работать в течение 6 часов в течение 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
вашего приложения работали 6 часов за последние 24 часа, вы не сможете запустить другую активную службу dataSync
, пока пользователь не выведет ваше приложение на передний план (что сбросит таймер). При попытке запустить другую активную службу dataSync
система выдаст исключение ForegroundServiceStartNotAllowedException
с сообщением об ошибке типа «Лимит времени уже исчерпан для активной службы типа 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