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

Если приложение предназначено для Android 15 или более поздней версии, система накладывает ограничения на продолжительность работы определенных служб переднего плана, пока ваше приложение находится в фоновом режиме. В настоящее время это ограничение применяется только к службам приоритетного типа dataSync и mediaProcessing . Существуют более строгие ограничения на тип службы переднего плана shortService , которые обсуждаются в документации этого типа службы.

Поведение тайм-аута

Система позволяет службам переднего плана dataSync и mediaProcessing работать в общей сложности 6 часов в течение 24 часов, после чего система вызывает метод Service.onTimeout(int, int) работающей службы (представленный в Android 15). (Тип службы переднего плана mediaProcessing был добавлен в Android 15.) Шестичасовой лимит времени отслеживается отдельно для dataSync и для служб mediaProcessing . Например, если служба dataSync работала только один час, у приложения будет только пять часов, доступных для служб переднего плана mediaProcessing , но для служб dataSync будут доступны полные шесть часов.

Когда служба переднего плана достигает шестичасового лимита, у службы есть несколько секунд для вызова 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
,

Если приложение предназначено для Android 15 или более поздней версии, система накладывает ограничения на продолжительность работы определенных служб переднего плана, пока ваше приложение находится в фоновом режиме. В настоящее время это ограничение применяется только к службам приоритетного типа dataSync и mediaProcessing . Существуют более строгие ограничения на тип службы переднего плана shortService , которые обсуждаются в документации этого типа службы.

Поведение тайм-аута

Система позволяет службам переднего плана dataSync и mediaProcessing работать в общей сложности 6 часов в течение 24 часов, после чего система вызывает метод Service.onTimeout(int, int) работающей службы (представленный в Android 15). (Тип службы переднего плана mediaProcessing был добавлен в Android 15.) Шестичасовой лимит времени отслеживается отдельно для dataSync и для служб mediaProcessing . Например, если служба dataSync работала только один час, у приложения будет только пять часов, доступных для служб переднего плана mediaProcessing , но для служб dataSync будут доступны полные шесть часов.

Когда служба переднего плана достигает шестичасового лимита, у службы есть несколько секунд для вызова 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