Android 10 (уровень API 29) и более поздних версий налагает ограничения на то, когда приложения могут запускать действия , когда приложение работает в фоновом режиме. Эти ограничения помогают свести к минимуму перерывы в работе пользователя и позволяют ему лучше контролировать то, что отображается на экране.
В этом руководстве уведомления представлены как альтернатива запуску действий в фоновом режиме. В нем также перечислены конкретные случаи, когда ограничение не применяется.
Вместо этого отображать уведомления
Почти во всех случаях приложения в фоновом режиме должны отображать чувствительные ко времени уведомления , чтобы предоставлять пользователю срочную информацию, а не напрямую запускать действие. Такие уведомления включают обработку входящего телефонного звонка или активного будильника.
Эта система оповещений и напоминаний на основе уведомлений предоставляет пользователям несколько преимуществ:
- При использовании устройства пользователь видит всплывающее уведомление, позволяющее ему ответить. Пользователь сохраняет текущий контекст и контролирует контент, который видит на экране.
- Уведомления, чувствительные ко времени, соответствуют правилам пользователя «Не беспокоить» . Например, пользователи могут разрешить звонки только от определенных контактов или от повторных звонков, если включен режим «Не беспокоить».
- Когда экран устройства выключен, полноэкранный режим запускается сразу.
- На экране настроек устройства пользователь может увидеть, какие приложения недавно отправляли уведомления, в том числе из определенных каналов уведомлений. На этом экране пользователь может управлять своими настройками уведомлений.
Когда приложения могут начинать действия
Приложения, работающие на 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.
Чтобы избежать случайного запуска активности на основании перечисленных условий , начиная с Android 14 существуют явные API, которые позволяют вам включать или отключать предоставление приложению разрешений на запуск активности.
Приложения, предназначенные для 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