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