В некоторых ситуациях, например при входящем звонке или срабатывании будильника, приложению может потребоваться срочно привлечь внимание пользователя. На устройствах с 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)
Используйте уведомления в реальном времени
Уведомления, которые нужно увидеть как можно скорее, могут быть более заметными. Рекомендуем продвигать постоянные уведомления как уведомления в реальном времени, чтобы показывать информацию о статусе в разных элементах интерфейса системы.