Вашему приложению может потребоваться срочно привлечь внимание пользователя в определённых ситуациях, например, при срабатывании будильника или входящем звонке. В приложениях, предназначенных для устройств под управлением Android 9 (уровень API 28) или более ранних версий, это можно реализовать, запустив событие, пока приложение находится в фоновом режиме. В этом документе показано, как реализовать такое поведение на устройствах под управлением Android 10 (уровень API 29) – Android 13 (уровень API 33).
Добавьте разрешение POST_NOTIFICATIONS
Начиная с Android 13, добавьте следующую строку в файл AndroidManifest.xml
:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
После этого вы сможете создать канал уведомлений.
Создать канал уведомлений
Создайте канал уведомлений для корректного отображения уведомлений и позвольте пользователю управлять уведомлениями в настройках приложения. Подробнее о каналах уведомлений см. в разделе Создание и управление каналами уведомлений .
Создайте каналы уведомлений в методе onCreate
вашего класса Application
:
Котлин
class DACapp : 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, запрашивайте разрешения на уведомления, прежде чем показывать уведомления пользователям.
Минимальная реализация выглядит так:
Котлин
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, нажатие кнопки Request permission
вызывает диалоговое окно, показанное на рисунке 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(666, notificationBuilder.build()) }
Отобразить уведомление пользователю
Вызов функции showNotification()
запускает уведомление следующим образом:
Котлин
Button(onClick = { showNotification() }) { Text(text = "Show notification") }
Уведомление в этом примере выглядит как на рисунке 4:

Текущее уведомление
Когда вы показываете пользователю уведомление, он может подтвердить или отклонить оповещение или напоминание вашего приложения. Например, пользователь может принять или отклонить входящий телефонный звонок.
Если ваше уведомление является текущим, например, о входящем телефонном звонке, свяжите его с активной службой . Следующий фрагмент кода показывает, как отобразить уведомление, связанное с активной службой:
Котлин
// Provide a unique integer for the "notificationId" of each notification. startForeground(notificationId, notification)
Ява
// Provide a unique integer for the "notificationId" of each notification. startForeground(notificationId, notification);