Android 10 (уровень API 29) и выше накладывают ограничения на то, когда приложения могут начинать действия, когда приложение работает в фоновом режиме. Эти ограничения помогают минимизировать прерывания для пользователя и позволяют пользователю лучше контролировать то, что отображается на его экране.
В этом руководстве представлены уведомления как альтернатива для запуска действий из фона. В нем также перечислены конкретные случаи, когда ограничение не применяется.
Вместо этого отображать уведомления
Почти во всех случаях приложения в фоновом режиме должны отображать уведомления, чувствительные ко времени , чтобы предоставить пользователю срочную информацию, а не напрямую начинать действие. Такие уведомления включают обработку входящего телефонного звонка или активный будильник.
Эта система оповещений и напоминаний на основе уведомлений обеспечивает пользователям ряд преимуществ:
- При использовании устройства пользователь видит уведомление head-up, которое позволяет ему ответить. Пользователь сохраняет свой текущий контекст и имеет контроль над контентом, который он видит на экране.
- Уведомления, чувствительные к времени, учитывают правила «Не беспокоить» пользователя. Например, пользователи могут разрешать звонки только от определенных контактов или от повторных звонков, когда включен режим «Не беспокоить».
- Когда экран устройства выключен, полноэкранное намерение запускается немедленно.
- На экране настроек устройства пользователь может увидеть, какие приложения недавно отправляли уведомления, в том числе из определенных каналов уведомлений. На этом экране пользователь может управлять своими предпочтениями в отношении уведомлений.
Когда приложения могут начинать действия
Приложения, работающие на Android 10 или более поздней версии, могут запускать действия при соблюдении одного или нескольких из следующих условий:
- Приложение имеет видимое окно, например, активность на переднем плане.
- Приложение имеет активность в заднем стеке приоритетной задачи.
Приложение имеет активность в стеке текущих задач на экране «Недавние» .
В приложении есть активность, которая началась совсем недавно.
Приложение вызвало
finish()
для активности совсем недавно. Это применимо только тогда, когда у приложения была активность на переднем плане или активность в заднем стеке задачи переднего плана на момент вызоваfinish()
.Приложение имеет одну из следующих служб, привязанных к системе. Этим службам может потребоваться запустить пользовательский интерфейс.
-
AccessibilityService
-
AutofillService
-
CallRedirectionService
-
HostApduService
-
InCallService
-
TileService
(Неприменимо в Android 14 (уровень API 34) и выше) -
VoiceInteractionService
-
VrListenerService
.
-
Приложение имеет службу, которая связана с другим, видимым приложением. Приложение, связанное со службой, должно оставаться видимым, чтобы приложение в фоновом режиме могло успешно начать действия.
Приложение получает уведомление
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
или создает их.
Отправителем 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()
или аналогичным методам.
Более подробную информацию можно найти в соответствующей справочной документации:
-
ActivityOptions.setPendingIntentBackgroundActivityStartMode
-
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
Строгий режим
Начиная с 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()
.Приложение имеет одну из следующих служб, привязанных к системе. Этим службам может потребоваться запустить пользовательский интерфейс.
-
AccessibilityService
-
AutofillService
-
CallRedirectionService
-
HostApduService
-
InCallService
-
TileService
(Неприменимо в Android 14 (уровень API 34) и выше) -
VoiceInteractionService
-
VrListenerService
.
-
Приложение имеет службу, которая связана с другим, видимым приложением. Приложение, связанное со службой, должно оставаться видимым, чтобы приложение в фоновом режиме могло успешно начать действия.
Приложение получает уведомление
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
или создает их.
Отправителем 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()
или аналогичным методам.
Более подробную информацию можно найти в соответствующей справочной документации:
-
ActivityOptions.setPendingIntentBackgroundActivityStartMode
-
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
Строгий режим
Начиная с Android 16, разработчик приложения может включить строгий режим , чтобы получать уведомления о блокировке запуска активности (или о риске блокировки при повышении целевого SDK приложения).
Пример кода для включения с самого начала в методе Application.onCreate()
вашего приложения, Activity или другого компонента приложения:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}
Более подробную информацию читайте в документации по строгому режиму .