Быстрый способ добавить уведомления в Android-приложение

dccb3aec71cce1cd9dde70221c7fe132.jpg

Перевели для вас статью Брендона Вивера о работе с уведомлениями в Android OS. Программист объясняет, как быстро добавить этот функционал в свое приложение. Статья, в первую очередь, будет полезна начинающим Android-разработчикам.

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

Skillbox рекомендует: Прикладной онлайн-курс «Аналитик данных Python».

Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».


Создание уведомления


Первым шагом будет создание объекта «Notification». Для этого используем NotificationCompat.Builder. Минимальное содержимое уведомления, которое позволяется разработчиками Android, — небольшая иконка. Это хорошо, но мало и не слишком полезно для пользователя. Ниже — схема стандартного уведомления, которое неплохо воспринимается.

4cceaff6f71d4b967bbcf91f2d566407.png

Маленькая иконка будет демонстрироваться постоянно, причем важно сделать ее альфа-прозрачной. Без этого вместо иконки вы получите белый квадратик.

Заголовок уведомления тоже важен. Это должно быть короткое описание, позволяющее понять, почему вообще пользователя беспокоят.

Тело уведомления содержит подробный текст со всей необходимой информацией.

Большая иконка может быть логотипом компании или еще чем-нибудь.

Ниже — два варианта действий для пользователя.

Для отображения всего этого нужен коротенький код:

    .setSmallIcon(R.drawable.ic_announcement)
    .setContentTitle(title)
    .setContentText(body)
    .build()


Демонстрируем уведомление


Мы создали наше уведомление, теперь задача — показать его. Android дает возможность сделать это при помощи NotificationManagerCompat. Для отправки уведомления необходимо использовать notificationID и само уведомление.

with(NotificationManagerCompat.from(context)) {
    if (getNotificationChannel(CHANNEL_ID) == null) {
        createNotificationChannel(context)
    }
    notify(notificationId, builder.build())
}


Дополнительный код нужен для проверки существования канала уведомлений.

Каналы и важность


Впервые пользователь получил возможность выбирать типы уведомлений от своих приложений в Oreo. Создать несколько каналов важно, поскольку если всё идет по одному каналу, пользователь не сможет выбрать необходимые ему типы уведомлений и заблокирует все.

teNotificationChannel(context: Context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val name = context.getString(R.string.channel_name)
        val descriptionText = context.getString(R.string.channel_description)
        val importance = NotificationManager.IMPORTANCE_HIGH
        val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
            description = descriptionText
        }
        NotificationManagerCompat.from(context).createNotificationChannel(channel)
    }
}


Канал должен включать следующую информацию:

  • ID — идентификатор канала;
  • название — оно должно быть коротким, например «Сообщения»;
  • важность — она может быть высокой, по умолчанию, низкой или минимальной;
  • описание — оно будет отображаться в настройках Android. Разработчику стоит позаботиться о качестве описания.


Взаимодействие с пользователем


Есть несколько способов взаимодействия пользователя с уведомлениями. К счастью, API, позволяющие контролировать процесс, достаточно похожи. Intents и PendingIntents используются для обратной связи с приложением, обеспечивая определенную логику обработки.

Самый простой способ обработки большого количества уведомлений — использование BroadcastReceiver. Когда пользователь начнет взаимодействовать с уведомлением, сработает Intent и будет вызван метод onReceive BroadcastReceiver.

val builder = NotificationCompat.Builder(context, CHANNEL_ID)
    ...
    .setContentIntent(onContentTapped /** Pending intent */)
    .setDeleteIntent(onSwipedAway /** Pending intent */)
    .addAction(
        R.drawable.ic_announcement,
        actionTitle,
        onActionTapped /** Pending intent */
    )


ContentIntent будет запущен по нажатию на уведомление. Стоит помнить, что уведомление не будет отклонено, если вы не вызовете в нем setAutoCancel (true).
DeleteIntent запустится после того, как пользователь удалит уведомление.
Действия — это кнопки внизу уведомления. У них также есть значки и названия.

Для создания BroadcastReceiver вам необходимо расширить класс BroadcastReceiver, переопределить onReceive-метод и не забыть объявить Receiver в AndroidManifest.xml.

class NotificationBroadcastReceiver : BroadcastReceiver() {
 
    override fun onReceive(context: Context, intent: Intent) {
        val action = intent.action
 
        when (action) {
            ACTION_ONE -> {
                Toast.makeText(context, "Action One hit!", Toast.LENGTH_SHORT).show()
            }
            ACTION_TWO -> {
                Toast.makeText(context, "Action Two hit!", Toast.LENGTH_SHORT).show()
            }
        }
    }
 
}
 
object NotificationController {
    fun pendingIntent(context: Context, name: String, extras: Bundle?): PendingIntent {
        val intent = Intent(context, NotificationBroadcastReceiver::class.java).apply {
            action = name
            putExtra(EXTRA_NOTIFICATION_ID, extras)
        }
 
        return PendingIntent.getBroadcast(context, 0, intent, 0)
    }
}


NotificationController — быстрый инструмент для создания PendingIntents для уведомлений. Самое главное — задавать действиям различные названия, чтобы правильно обрабатывать реакции пользователя на уведомление. Также, если вы собираетесь запускать Activity из BroadcastReceiver, вы должны использовать IntentFlag NEW_TASK.

Это нужно, чтобы обработать все уведомления в одном месте. Intents также могут быть зарегистрированы для разных BroadcastReceivers, так что вы можете ограничить область действия одним BroadcastReceiver для каждого типа уведомления.

Все это — лишь начало работы. В документации много замечательных примеров, так что не забывайте изучать ее, если есть вопросы или желание сделать что-то более продвинутое.

Skillbox рекомендует:

© Habrahabr.ru