Тайм-ауты службы переднего плана

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

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

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