Notification Channel (канал обавештења) — то је механизам Android-а, уведен у верзији 8.0 (API 26), који групише обавештења по категоријама и даје кориснику контролу над њиховим понашањем. Сваки канал одређује ниво важности, звук, вибрацију и визуелни изглед за сва обавештења послата кроз њега. Према Android Developers, NotificationChannel је обавезан за сва обавештења на Android 8+ — без њега обавештења се не приказују.
Главне тачке
Notification Channel — то је логички контејнер за обавештења истог типа у Android 8+ (Oreo). Програмер креира канал са јединственим ID-јем, подешава његове параметре и затим шаље свако обавештење са навођењем овог канала. Сва обавештења у истом каналу наслеђују његова подешавања.
Пре Android 8 управљање обавештењима је било бинарно: све или ништа. Корисник је могао само потпуно да искључи обавештења апликације. Канали су решили овај проблем: сада се могу искључити рекламна обавештења, али задржати поруке од пријатеља.
Након креирања канала, његова важност (importance) може бити измењена од стране корисника у било ком тренутку преко Подешавања → Апликације → Обавештења. Програмер не може програмски да промени importance након креирања канала — ово је Android-ово сигурносно ограничење.
На Android 8+ свако обавештење мора бити послато преко NotificationChannel-а. Ако апликација покуша да прикаже обавештење без канала — систем га ћутке игнорише. Изузетак — обавештења преко NotificationCompat са подразумеваним каналом, који библиотека аутоматски креира.
Канал обавештења се дефинише скупом параметара који се подешавају приликом његовог креирања преко класе NotificationChannel. Главни параметар — ниво важности (importance level), који одређује како обавештење интерагује са корисником.
Након креирања, канал се појављује у системским подешавањима обавештења. Корисник може да промени importance, искључи звук, вибрацију или потпуно блокира канал. Све измене ступају на снагу одмах за сва каснија обавештења.
Приликом креирања NotificationChannel-а могу се подесити: звук (прилагођени или системски), вибрација (образац и трајање), светлосни индикатор (боја LED), значка (setShowBadge), видљивост на закључаном екрану (setLockscreenVisibility) и режим Не узнемиравај (setBypassDnd). Ови параметри се фиксирају при креирању канала и касније их може мењати само корисник.
Ниво важности (importance) — главни параметар канала. Он одређује да ли ће обавештење пуштати звук, појављивати се на екрану или само бити смештено у сенци. Важност не треба мешати са приоритетом — importance поставља канал, а приоритет (setPriority) се на Android 8+ игнорише.
| Ниво | Константа | Понашање | Звук |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | Приказује heads-up банер, појављује се у панелу | Да |
| DEFAULT | IMPORTANCE_DEFAULT (3) | Појављује се у панелу, без heads-up-а | Да |
| LOW | IMPORTANCE_LOW (2) | Појављује се у панелу без звука | Не |
| MIN | IMPORTANCE_MIN (1) | Само у сенци, без звука и вибрације | Не |
| NONE | IMPORTANCE_NONE (0) | Уопште се не приказује | Не |
За већину корисничких сценарија користите IMPORTANCE_DEFAULT (3) — обавештење ће се појавити у панелу са звуком, али без искачућег банера. IMPORTANCE_HIGH користите само за критичне догађаје: долазни позив, порука од саговорника, подсетник са тајмером.
Канал се креира једном — при покретању апликације или при првој употреби. Најбоља пракса је креирати све канале при покретању апликације, у методи Application.onCreate. Поновно креирање постојећег канала је безбедно — Android игнорише позив ако канал већ постоји.
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"Поруке",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Обавештења о новим порукама"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"Акције и вести",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Маркетиншка обавештења и специјалне понуде"
setShowBadge(false)
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(messagesChannel)
manager.createNotificationChannel(promoChannel)
}
companion object {
const val CHANNEL_MESSAGES = "messages"
const val CHANNEL_PROMO = "promo"
}
}
Приликом слања обавештења наведите ID канала преко setChannelId (за NotificationCompat) или у конструктору Notification.Builder-а. Ако канал са наведеним ID-јем не постоји — обавештење неће бити приказано, али грешка неће настати.
Android пружа неколико API-ја за програмско управљање каналима: добијање листе, брисање и провера тренутних подешавања. Брисање канала доводи до тога да систем избрише сва његова обавештења из историје.
val manager =
getSystemService(NotificationManager::class.java)
// Добиј листу свих канала
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Канали", "${channel.id}: ${channel.importance}")
}
// Сазнај тренутни importance (корисник га је могао променити)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// Корисник је искључио канал
suggestEnablingChannel()
}
// Обриши канал
manager.deleteNotificationChannel(CHANNEL_PROMO)
Након креирања канала, програмер не може програмски да промени његов importance — ово је Android-ово ограничење за заштиту корисника од злоупотреба. Ако је потребно променити важност канала, креирајте нови канал са другим ID-јем и мигрирајте обавештења.
Ако је потребно променити важност постојећег канала, креирајте нови канал са другим ID-јем (нпр. „messages_v2“) и почните да шаљете обавештења на њега. Стари канал се може обрисати преко deleteNotificationChannel — сва његова обавештења ће бити уклоњена из историје. Обавестите корисника о миграцији преко интерфејса апликације да не би изгубио подешавања.
NotificationChannelGroup обједињује више канала у једну визуелну групу у интерфејсу Android подешавања. Групе помажу кориснику да се снађе када апликација користи 5+ канала: на пример, „Друштвене мреже“, „Системске“, „Маркетинг“.
Група се креира преко createNotificationChannelGroup и прослеђује каналу при његовом креирању преко методе setGroup. Брисање групе такође брише све њене канале. Сваки канал може припадати само једној групи.
У пракси, групе канала су препоручене за апликације са више од 3 канала. Оне поједностављују навигацију у подешавањима и смањују вероватноћу да ће корисник искључити сва обавештења одједном, не разумевајући листу канала.
Група се креира преко createNotificationChannelGroup са јединственим ID-јем и називом. Затим се сваки канал повезује са групом преко методе setGroup. У системским подешавањима, група се приказује као одељак са насловом испод којег се налазе сви канали ове групе. Ако се група избрише, сви њени канали се такође аутоматски бришу од стране система без могућности опоравка.
Правилно пројектовање канала обавештења директно утиче на корисничко искуство и задржавање. Основни образац — три нивоа важности: критични канал (IMPORTANCE_HIGH) за поруке и позиве, стандардни (IMPORTANCE_DEFAULT) за општа обавештења и тихи (IMPORTANCE_LOW) за маркетинг и вести. Оваква градација даје кориснику разумљив избор без преоптерећења.
Други образац — канал по функционалном модулу. Сваки велики модул апликације (ћаскање, поруџбине, канал, маркетинг) добија свој канал. Ако има више од 5 модула, обједините их у NotificationChannelGroup. У системским подешавањима, група се приказује као одељак са скривајућим елементима — то поједностављује навигацију.
Трећи образац — канал за програмера. Креирајте засебан канал са IMPORTANCE_MIN за отклањање грешака и сервисна обавештења. Корисници их неће видети у панелу, али програмер може анализирати записе преко adb-а. У продукцији овај канал се може обрисати или сакрити из интерфејса преко Intent-а у подешавањима.
Четврти образац — повратна информација о каналима. Приказујте кориснику у интерфејсу који су канали активни и који је њихов тренутни importance. На Android 8+ можете добити статус канала преко getNotificationChannel и предложити кориснику да промени подешавања ако је канал искључен. Ово је посебно важно за критичне функције апликације.
Често постављана питања
Обавештење се неће приказати ни у панелу, ни у сенци. Систем ће ћутке игнорисати позив notify(). Изузеци: при коришћењу NotificationCompat библиотека креира подразумевани канал, али је његов importance увек DEFAULT. Препоручује се увек креирати сопствене канале.
Може се променити назив, опис и звук канала. Не може се променити importance — ова одлука је заштићена системом од програмера. Ако је потребно повећати важност — креирајте нови канал са другим ID-јем и користите га за нова обавештења. Корисник може мењати importance у било ком тренутку.
Користите getNotificationChannel и проверите importance: ако је вредност IMPORTANCE_NONE, канал је искључен. Такође можете отворити системска подешавања канала преко Intent-а: Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS са параметрима app_package и channel_id.
Нема ограничења — Android не поставља лимит на број канала. Ипак, препоручује се да не креирате више од 5–10 канала како не бисте преоптеретили корисника избором. Оптимални минимум је 2–3 канала: критична обавештења, обична и маркетиншка.
На Android 7.1 (API 25) и старијим верзијама канали нису подржани. Класа NotificationChannel је доступна само од API 26. За уназадну компатибилност користите NotificationCompat и обмотајте креирање канала условом if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O).
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође