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) | Εμφανίζει banner heads-up, εμφανίζεται στο πλαίσιο | Ναι |
| DEFAULT | IMPORTANCE_DEFAULT (3) | Εμφανίζεται στο πλαίσιο, χωρίς heads-up | Ναι |
| LOW | IMPORTANCE_LOW (2) | Εμφανίζεται στο πλαίσιο χωρίς ήχο | Όχι |
| MIN | IMPORTANCE_MIN (1) | Μόνο στη σκιά, χωρίς ήχο και δόνηση | Όχι |
| NONE | IMPORTANCE_NONE (0) | Δεν εμφανίζεται καθόλου | Όχι |
Για τα περισσότερα σενάρια χρήσης, χρησιμοποιήστε IMPORTANCE_DEFAULT (3) — η ειδοποίηση θα εμφανίζεται στο πλαίσιο με ήχο, αλλά χωρίς αναδυόμενο banner. Χρησιμοποιήστε 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 στις ρυθμίσεις.
Το τέταρτο πρότυπο — ανατροφοδότηση σχετικά με τα κανάλια. Δείξτε στον χρήστη στη διεπαφή ποια κανάλια είναι ενεργά και ποια είναι η τρέχουσα σπουδαιότητά τους. Σε 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. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης