Показывать срочные уведомления

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

Экран уведомлений &quot;Информация о приложении&quot;, на котором показан созданный канал.
Рисунок 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.

Системное диалоговое окно с запросом разрешения на показ уведомлений.
Рисунок 2. Системное диалоговое окно для запроса разрешения на уведомления.

Когда пользователь предоставляет разрешение, система обновляет экран Информация о приложении, как показано на рисунке 3:

Экран &quot;Информация о приложении&quot;, на котором показаны предоставленные разрешения на уведомления.
Рисунок 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 показано системное уведомление с высоким приоритетом:

Уведомление с высоким приоритетом, которое показывается на устройстве.
Рисунок 4. Уведомление с высоким приоритетом.

Текущее уведомление

Когда пользователь увидит уведомление, он сможет подтвердить или отклонить его. Например, пользователь может принять или отклонить входящий телефонный звонок.

Если уведомление относится к фоновой задаче, например активному телефонному звонку, свяжите его с сервисом, работающим в активном режиме. В приведенном ниже фрагменте кода показано, как отобразить уведомление, связанное с активной службой:

// Provide a unique integer for the "notificationId" of each notification.
startForeground(notificationId, notification)

Используйте уведомления в реальном времени

Уведомления, которые нужно увидеть как можно скорее, могут быть более заметными. Рекомендуем продвигать постоянные уведомления как уведомления в реальном времени, чтобы показывать информацию о статусе в разных элементах интерфейса системы.