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

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

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

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