Если приложение предназначено для Android 15 или выше, система накладывает ограничения на то, как долго определенные службы переднего плана могут работать, пока ваше приложение находится в фоновом режиме. В настоящее время это ограничение применяется только к службам переднего плана mediaProcessing
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
с сообщением об ошибке типа «Time limit already used 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