В Android 10 (уровень API 29) и более поздних версиях вводятся ограничения на запуск приложений в фоновом режиме. Эти ограничения помогают минимизировать прерывания работы для пользователя и позволяют ему лучше контролировать происходящее на экране.
В этом руководстве уведомления представлены как альтернативный способ запуска действий в фоновом режиме. Также перечислены конкретные случаи, когда это ограничение не применяется.
Display notifications instead
Практически во всех случаях приложения, работающие в фоновом режиме, должны отображать срочные уведомления , чтобы предоставлять пользователю необходимую информацию, вместо того чтобы сразу запускать какое-либо действие. К таким уведомлениям относятся, например, обработка входящего телефонного звонка или активный будильник.
Эта система оповещений и напоминаний, основанная на уведомлениях, предоставляет пользователям ряд преимуществ:
- При использовании устройства пользователь видит всплывающее уведомление, позволяющее ему ответить. Пользователь сохраняет текущий контекст и контролирует содержимое, отображаемое на экране.
- Уведомления, действующие в течение определенного времени, учитывают правила режима «Не беспокоить», установленные пользователем. Например, при включенном режиме «Не беспокоить» пользователи могут разрешать звонки только от определенных контактов или от повторных абонентов.
- Когда экран устройства выключен, полноэкранный режим запускается немедленно.
- В настройках устройства пользователь может увидеть, какие приложения недавно отправляли уведомления, в том числе из определенных каналов уведомлений. С этого экрана пользователь может управлять своими настройками уведомлений.
When apps can start activities
Приложения, работающие на Android 10 или более поздних версиях, могут запускать действия при выполнении одного или нескольких из следующих условий:
- В приложении есть видимое окно, например, окно с активностью на переднем плане.
- Приложение имеет активность в стеке задач переднего плана.
В приложении есть активность, которая находится в стеке ожидающих задач на экране «Недавние» .
В приложении появилась новая функция, которая запустилась совсем недавно.
Приложение вызвало
finish()для активности совсем недавно. Это относится только к тем случаям, когда в момент вызоваfinish()у приложения была либо активность на переднем плане, либо активность в стеке задач переднего плана.Приложение использует одну из следующих служб, которая подключена к системе. Для работы этих служб может потребоваться запуск пользовательского интерфейса.
-
AccessibilityService -
AutofillService -
CallRedirectionService -
HostApduService -
InCallService -
TileService(не применимо в Android 14 (уровень API 34) и выше) -
VoiceInteractionService -
VrListenerService.
-
Приложение содержит сервис, который связан с другим, видимым приложением. Приложение, связанное с этим сервисом, должно оставаться видимым, чтобы фоновое приложение могло успешно запускать свои действия.
Приложение получает от системы уведомление
PendingIntent. В случае ожидающих намерений для служб и широковещательных приемников приложение может начать работу в течение нескольких секунд после отправки ожидающего намерения.The app receives a
PendingIntentthat is sent from a different, visible app.Приложение получает системное широковещательное сообщение, в котором ожидается запуск пользовательского интерфейса. Примеры включают
ACTION_NEW_OUTGOING_CALLиSECRET_CODE_ACTION. Приложение может начать выполнять действия в течение нескольких секунд после отправки широковещательного сообщения.Приложение связывается с сопутствующим аппаратным устройством через API
CompanionDeviceManager. Этот API позволяет приложению запускать действия в ответ на действия, которые пользователь выполняет на сопряженном устройстве.Приложение представляет собой контроллер политик устройств, работающий в режиме владельца устройства . Примеры использования включают полностью управляемые корпоративные устройства , а также специализированные устройства, такие как цифровые вывески и киоски.
Приложение получает от пользователя разрешение
SYSTEM_ALERT_WINDOW.
Для запуска действий из PendingIntents требуется согласие.
Чтобы избежать случайного запуска Activity на основе перечисленных условий , начиная с Android 14, существуют специальные API, позволяющие включать или отключать предоставление приложению разрешений на запуск Activity.
Приложения, ориентированные на Android 15 и выше, по умолчанию больше не будут неявно предоставлять права на запуск фоновых действий (BAL) создаваемым ими PendingIntents . Для этого требуется явное согласие, и вот параметры, которые зависят от того, отправляет или создает приложение PendingIntents .
By the Sender of the PendingIntent
Приложения, ориентированные на Android 14 и выше, которые хотят запустить PendingIntent должны
- fulfill the listed conditions and
- включить опцию, разрешающую запуск фоновых процессов на основе указанных исключений.
Эта опция должна активироваться только в том случае, если разработчик приложения знает, что приложение собирается запустить Activity.
Для включения этой функции приложение должно передать пакет ActivityOptions с setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) в метод PendingIntent.send() или аналогичный метод.
By the Creator of the PendingIntent
Приложениям, ориентированным на Android 15 и выше, которые создают PendingIntent теперь необходимо явно разрешить запуск фоновых процессов, если они хотят, чтобы эти PendingIntents были доступны для запуска при указанных условиях .
In most cases, the app starting the PendingIntent should be the one to opt in. However, if the creating app needs to grant these privileges:
- Запуск
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());
)
}
Для получения более подробной информации ознакомьтесь с документацией по строгому режиму .