Как показать уведомление в android?
Мало того, что сообщения имеют довольно сложную структуру, но они еще и зависят от версии API, под которое билдится приложение.
Чтобы показывать уведомления, начиная с 33 версии API, вы должны добавить в манифест разрешение POST_NOTIFICATIONS.
1 |
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> |
Notification создаётся с помощью Notification.Builder. Число параметров конструктора зависит от версии SDK. Начиная с 26й, нужно обязательно создавать и использовать канал уведомлений (NotificationChannel).
Созданное уведомление отправляется менеджеру уведомлений, экземпляр которого получается через getSystemService.
Как видите — не простая конструкция. Вот код демонстрирующий функцию, организующую создание и отправку простейшего уведомления.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
private fun showNotification(title:String, text: String) { val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager val SDKVer26AndHigher = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O lateinit var builder: Notification.Builder if (SDKVer26AndHigher) { val notificationChannel = NotificationChannel( CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT ) notificationManager.createNotificationChannel(notificationChannel) builder = Notification.Builder(this, CHANNEL_ID) } else { builder = Notification.Builder(this) } val notification = builder .setContentTitle(title) .setContentText(text) .setSmallIcon(R.drawable.ic_launcher_background) .build() notificationManager.notify(NOTIFICATION_ID, notification) } companion object { private const val CHANNEL_ID = "channel_id" private const val CHANNEL_NAME = "channel_name" private const val NOTIFICATION_ID = 1 } |
Проверку версии SDK я вынес в отдельную переменную, чтобы сделать пример более читаемым. Кроме того существует класс NotificationCompat, который эту логику уже содержит.
NOTIFICATION_ID — должен быть уникальным для каждого нового сообщения. Потому обычно это не константа, а счетчик.
Помимо обязательных параметров — заголовка, текста и иконки (без любого из них приложение будет крашится), уведомление может содержать много прочих атрибутов (звук, вибрацию и т.д.).
CHANNEL_NAME — это название канала уведомлений, которое увидит пользователь. У пользователя есть возможность управлять каналами, и нужно чтобы название было информативным. Так вы сможете разнести уведомления по разным каналам, чтобы дать возможность отключить пользователю что то не очень нужное и оставить то, что имеет значение.