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

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

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

  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 с сообщением об ошибке типа «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