Ограничения на запуск действий в фоновом режиме

Android 10 (уровень API 29) и выше накладывают ограничения на то, когда приложения могут начинать действия, когда приложение работает в фоновом режиме. Эти ограничения помогают минимизировать прерывания для пользователя и позволяют пользователю лучше контролировать то, что отображается на его экране.

В этом руководстве представлены уведомления как альтернатива для запуска действий из фона. В нем также перечислены конкретные случаи, когда ограничение не применяется.

Вместо этого отображать уведомления

Почти во всех случаях приложения в фоновом режиме должны отображать уведомления, чувствительные ко времени , чтобы предоставить пользователю срочную информацию, а не напрямую начинать действие. Такие уведомления включают обработку входящего телефонного звонка или активный будильник.

Эта система оповещений и напоминаний на основе уведомлений обеспечивает пользователям ряд преимуществ:

  • При использовании устройства пользователь видит уведомление head-up, которое позволяет ему ответить. Пользователь сохраняет свой текущий контекст и имеет контроль над контентом, который он видит на экране.
  • Уведомления, чувствительные к времени, учитывают правила «Не беспокоить» пользователя. Например, пользователи могут разрешать звонки только от определенных контактов или от повторных звонков, когда включен режим «Не беспокоить».
  • Когда экран устройства выключен, полноэкранное намерение запускается немедленно.
  • На экране настроек устройства пользователь может увидеть, какие приложения недавно отправляли уведомления, в том числе из определенных каналов уведомлений. На этом экране пользователь может управлять своими предпочтениями в отношении уведомлений.

Когда приложения могут начинать действия

Приложения, работающие на Android 10 или более поздней версии, могут запускать действия при соблюдении одного или нескольких из следующих условий:

  • Приложение имеет видимое окно, например, активность на переднем плане.
  • Приложение имеет активность в заднем стеке приоритетной задачи.
  • Приложение имеет активность в стеке текущих задач на экране «Недавние» .

  • В приложении есть активность, которая началась совсем недавно.

  • Приложение вызвало finish() для активности совсем недавно. Это применимо только тогда, когда у приложения была активность на переднем плане или активность в заднем стеке задачи переднего плана на момент вызова finish() .

  • Приложение имеет одну из следующих служб, привязанных к системе. Этим службам может потребоваться запустить пользовательский интерфейс.

  • Приложение имеет службу, которая связана с другим, видимым приложением. Приложение, связанное со службой, должно оставаться видимым, чтобы приложение в фоновом режиме могло успешно начать действия.

  • Приложение получает уведомление PendingIntent от системы. В случае ожидающих намерений для служб и широковещательных приемников приложение может начать действия в течение нескольких секунд после отправки ожидающего намерения.

  • Приложение получает PendingIntent , отправленный из другого видимого приложения.

  • Приложение получает системную трансляцию, в которой ожидается запуск пользовательского интерфейса. Примерами являются ACTION_NEW_OUTGOING_CALL и SECRET_CODE_ACTION . Приложение может начать действия в течение нескольких секунд после отправки трансляции.

  • Приложение связано с сопутствующим аппаратным устройством через API CompanionDeviceManager . Этот API позволяет приложению запускать действия в ответ на действия, которые пользователь выполняет на сопряженном устройстве.

  • Приложение представляет собой контроллер политики устройства, работающий в режиме владельца устройства . Примеры использования включают полностью управляемые корпоративные устройства , а также специализированные устройства , такие как цифровые вывески и киоски.

  • Пользователь предоставил приложению разрешение SYSTEM_ALERT_WINDOW .

При запуске действий из PendingIntents требуется согласие

Чтобы избежать случайных запусков Activity на основе перечисленных условий , начиная с Android 14 существуют явные API, которые позволяют вам разрешить или запретить предоставление приложению разрешений на запуск Activity.

Приложения, ориентированные на Android 15 или выше, по умолчанию больше не будут неявно предоставлять привилегии запуска фоновой активности (BAL) для PendingIntents , которые они создают. Требуется явное согласие, чтобы сделать это, эти параметры зависят от того, отправляет ли приложение PendingIntents или создает их.

Таблица ожидающих намерений
Рисунок 1: Поток принятия решений для запуска фоновой активности.

Отправителем PendingIntent

Приложения, ориентированные на Android 14 или выше, которые хотят запустить PendingIntent должны

Такое согласие должно иметь место только в том случае, если разработчик приложения знает, что приложение собирается начать действие.

Чтобы согласиться, приложение должно передать пакет ActivityOptions с setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) в PendingIntent.send() или аналогичные методы.

Создатель PendingIntent

Приложения для Android 15 или выше, создающие PendingIntent , теперь должны явно разрешить запуск фоновой активности, если они хотят, чтобы эти PendingIntents можно было запускать при перечисленных условиях .

В большинстве случаев приложение, запускающее PendingIntent , должно дать свое согласие. Однако, если создающему приложению необходимо предоставить следующие привилегии:

  • PendingIntent может быть запущен в любой момент, когда приложение-создатель становится видимым.
  • PendingIntent можно запустить в любое время, если создающее приложение имеет особые привилегии.

Чтобы включить эту функцию, приложение должно передать пакет ActivityOptions с setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) методу PendingIntent.getActivity() или аналогичным методам.

Более подробную информацию можно найти в соответствующей справочной документации:

Строгий режим

Начиная с Android 16, разработчик приложения может включить строгий режим , чтобы получать уведомления о блокировке запуска активности (или о риске блокировки при повышении целевого SDK приложения).

Пример кода для включения с самого начала в методе Application.onCreate() вашего приложения, Activity или другого компонента приложения:

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }

Более подробную информацию читайте в документации по строгому режиму .

,

Android 10 (уровень API 29) и выше накладывают ограничения на то, когда приложения могут начинать действия, когда приложение работает в фоновом режиме. Эти ограничения помогают минимизировать прерывания для пользователя и позволяют пользователю лучше контролировать то, что отображается на его экране.

В этом руководстве представлены уведомления как альтернатива для запуска действий из фона. В нем также перечислены конкретные случаи, когда ограничение не применяется.

Вместо этого отображать уведомления

Почти во всех случаях приложения в фоновом режиме должны отображать уведомления, чувствительные ко времени , чтобы предоставить пользователю срочную информацию, а не напрямую начинать действие. Такие уведомления включают обработку входящего телефонного звонка или активный будильник.

Эта система оповещений и напоминаний на основе уведомлений обеспечивает пользователям ряд преимуществ:

  • При использовании устройства пользователь видит уведомление head-up, которое позволяет ему ответить. Пользователь сохраняет свой текущий контекст и имеет контроль над контентом, который он видит на экране.
  • Уведомления, чувствительные к времени, учитывают правила «Не беспокоить» пользователя. Например, пользователи могут разрешать звонки только от определенных контактов или от повторных звонков, когда включен режим «Не беспокоить».
  • Когда экран устройства выключен, полноэкранное намерение запускается немедленно.
  • На экране настроек устройства пользователь может увидеть, какие приложения недавно отправляли уведомления, в том числе из определенных каналов уведомлений. На этом экране пользователь может управлять своими предпочтениями в отношении уведомлений.

Когда приложения могут начинать действия

Приложения, работающие на Android 10 или более поздней версии, могут запускать действия при соблюдении одного или нескольких из следующих условий:

  • Приложение имеет видимое окно, например, активность на переднем плане.
  • Приложение имеет активность в заднем стеке приоритетной задачи.
  • Приложение имеет активность в стеке текущих задач на экране «Недавние» .

  • В приложении есть активность, которая началась совсем недавно.

  • Приложение вызвало finish() для активности совсем недавно. Это применимо только тогда, когда у приложения была активность на переднем плане или активность в заднем стеке задачи переднего плана на момент вызова finish() .

  • Приложение имеет одну из следующих служб, привязанных к системе. Этим службам может потребоваться запустить пользовательский интерфейс.

  • Приложение имеет службу, которая связана с другим, видимым приложением. Приложение, связанное со службой, должно оставаться видимым, чтобы приложение в фоновом режиме могло успешно начать действия.

  • Приложение получает уведомление PendingIntent от системы. В случае ожидающих намерений для служб и широковещательных приемников приложение может начать действия в течение нескольких секунд после отправки ожидающего намерения.

  • Приложение получает PendingIntent , отправленный из другого видимого приложения.

  • Приложение получает системную трансляцию, в которой ожидается запуск пользовательского интерфейса. Примерами являются ACTION_NEW_OUTGOING_CALL и SECRET_CODE_ACTION . Приложение может начать действия в течение нескольких секунд после отправки трансляции.

  • Приложение связано с сопутствующим аппаратным устройством через API CompanionDeviceManager . Этот API позволяет приложению запускать действия в ответ на действия, которые пользователь выполняет на сопряженном устройстве.

  • Приложение представляет собой контроллер политики устройства, работающий в режиме владельца устройства . Примеры использования включают полностью управляемые корпоративные устройства , а также специализированные устройства , такие как цифровые вывески и киоски.

  • Пользователь предоставил приложению разрешение SYSTEM_ALERT_WINDOW .

При запуске действий из PendingIntents требуется согласие

Чтобы избежать случайных запусков Activity на основе перечисленных условий , начиная с Android 14 существуют явные API, которые позволяют вам разрешить или запретить предоставление приложению разрешений на запуск Activity.

Приложения, ориентированные на Android 15 или выше, по умолчанию больше не будут неявно предоставлять привилегии запуска фоновой активности (BAL) для PendingIntents , которые они создают. Требуется явное согласие, чтобы сделать это, эти параметры зависят от того, отправляет ли приложение PendingIntents или создает их.

Таблица ожидающих намерений
Рисунок 1: Поток принятия решений для запуска фоновой активности.

Отправителем PendingIntent

Приложения, ориентированные на Android 14 или выше, которые хотят запустить PendingIntent должны

Такое согласие должно иметь место только в том случае, если разработчик приложения знает, что приложение собирается начать действие.

Чтобы согласиться, приложение должно передать пакет ActivityOptions с setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) в PendingIntent.send() или аналогичные методы.

Создатель PendingIntent

Приложения для Android 15 или выше, создающие PendingIntent , теперь должны явно разрешить запуск фоновой активности, если они хотят, чтобы эти PendingIntents можно было запускать при перечисленных условиях .

В большинстве случаев приложение, запускающее PendingIntent , должно дать свое согласие. Однако, если создающему приложению необходимо предоставить следующие привилегии:

  • PendingIntent может быть запущен в любой момент, когда приложение-создатель становится видимым.
  • PendingIntent можно запустить в любое время, если создающее приложение имеет особые привилегии.

Чтобы включить эту функцию, приложение должно передать пакет ActivityOptions с setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) методу PendingIntent.getActivity() или аналогичным методам.

Более подробную информацию можно найти в соответствующей справочной документации:

Строгий режим

Начиная с Android 16, разработчик приложения может включить строгий режим , чтобы получать уведомления о блокировке запуска активности (или о риске блокировки при повышении целевого SDK приложения).

Пример кода для включения с самого начала в методе Application.onCreate() вашего приложения, Activity или другого компонента приложения:

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }

Более подробную информацию читайте в документации по строгому режиму .