В некоторых ситуациях, например при срабатывании будильника или входящем вызове, приложению может потребоваться срочно привлечь внимание пользователя. На устройствах с Android 9 (уровень API 28) или более ранней версией ОС для этого можно запустить действие, пока приложение работает в фоновом режиме. В этом документе рассказывается, как добиться такого поведения на устройствах с Android 10 (уровень API 29) и более поздними версиями.
Добавьте разрешение POST_NOTIFICATIONS
Начиная с Android 13 (уровень API 33), объявите разрешение POST_NOTIFICATIONS в файле AndroidManifest.xml:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
После объявления разрешения создайте канал уведомлений.
Как создать канал уведомлений
Создайте канал уведомлений, чтобы показывать уведомления и позволить пользователям управлять категориями уведомлений в системных настройках. Подробнее о создании каналов уведомлений и управлении ими…
Создайте каналы уведомлений в методе onCreate класса Application:
class MyApplication : Application() { override fun onCreate() { super.onCreate() val channel = NotificationChannel( CHANNEL_ID, "High priority notifications", NotificationManager.IMPORTANCE_HIGH ) val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) } }
Когда пользователь впервые запускает приложение, система показывает канал на экране О приложении, как показано на рисунке 1.
Управление разрешениями на уведомления
Начиная с Android 13, прежде чем показывать уведомления пользователям, необходимо запрашивать разрешение на уведомления.
В следующем примере кода показано, как запросить разрешение на уведомления во время выполнения в Jetpack Compose:
val permissionLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.RequestPermission(), onResult = { hasNotificationPermission = it } ) // ... Button( onClick = { if (!hasNotificationPermission) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) } } }, ) { Text(text = "Request permission") }
На устройствах с Android 13 и более поздних версий при нажатии кнопки Запросить разрешение появляется системное диалоговое окно, показанное на рисунке 2.
Когда пользователь предоставляет разрешение, система обновляет экран О приложении, как показано на рисунке 3.
Как создать уведомление с высоким приоритетом
При создании уведомления с высоким приоритетом укажите понятный заголовок и текст сообщения. Также назначьте канал высокой важности и уровень приоритета.
В следующем примере кода настраивается и создается уведомление с высоким приоритетом:
private fun showNotification() { val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.baseline_auto_awesome_24) .setContentTitle("HIGH PRIORITY") .setContentText("Check this dog puppy video NOW!") .setPriority(NotificationCompat.PRIORITY_HIGH) .setCategory(NotificationCompat.CATEGORY_RECOMMENDATION) notificationManager.notify(0, notificationBuilder.build()) }
Показать уведомление пользователю.
Вызов функции showNotification активирует уведомление следующим образом:
Button(onClick = { showNotification() }) { Text(text = "Show notification") }
На рисунке 4 показано уведомление с высоким приоритетом, которое отображается в системе.
Текущее уведомление
Когда пользователь видит уведомление, он может подтвердить или отклонить его. Например, пользователь может принять или отклонить входящий вызов.
Если уведомление связано с текущей фоновой задачей, например активным телефонным звонком, свяжите его с активной службой. В следующем фрагменте кода показано, как отобразить уведомление, связанное с активной службой:
// Provide a unique integer for the "notificationId" of each notification. startForeground(notificationId, notification)
Используйте новости в реальном времени
Для срочных текущих уведомлений может быть полезно повышение видимости. Рекомендуем продвигать текущие уведомления как обновления в реальном времени, чтобы показывать информацию о статусе в разных разделах системного интерфейса.