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

Если приложение ориентировано на 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