Notification Channel (kênh thông báo) là một cơ chế Android, được giới thiệu trong phiên bản 8.0 (API 26), nhóm các thông báo theo danh mục và cho người dùng kiểm soát hành vi của chúng. Mỗi kênh xác định mức độ quan trọng, âm thanh, rung và hình thức trực quan cho tất cả các thông báo được gửi qua nó. Theo Android Developers, NotificationChannel là bắt buộc cho tất cả các thông báo trên Android 8+ — nếu không có nó, thông báo sẽ không được hiển thị.
Các điểm chính
Notification Channel là một container logic cho các thông báo cùng loại trong Android 8+ (Oreo). Nhà phát triển tạo một kênh với ID duy nhất, thiết lập các tham số của nó, sau đó gửi từng thông báo với kênh này. Tất cả các thông báo trong cùng một kênh kế thừa các cài đặt của nó.
Trước Android 8, việc quản lý thông báo là nhị phân: tất cả hoặc không có gì. Người dùng chỉ có thể tắt hoàn toàn tất cả các thông báo của ứng dụng. Các kênh đã giải quyết vấn đề này: giờ đây bạn có thể tắt các thông báo “quảng cáo” nhưng giữ lại các “tin nhắn từ bạn bè.”
Sau khi tạo kênh, mức độ quan trọng của nó có thể được thay đổi bởi người dùng bất kỳ lúc nào qua Cài đặt → Ứng dụng → Thông báo. Nhà phát triển không thể thay đổi mức độ quan trọng bằng mã sau khi tạo kênh — đây là hạn chế bảo mật của Android.
Trên Android 8+, mỗi thông báo phải được gửi qua NotificationChannel. Nếu ứng dụng cố gắng hiển thị thông báo mà không có kênh, hệ thống sẽ im lặng bỏ qua nó. Ngoại lệ là các thông báo qua NotificationCompat với kênh mặc định, được thư viện tự động tạo.
Một kênh thông báo được xác định bởi một tập các tham số được thiết lập khi tạo thông qua lớp NotificationChannel. Tham số chính là mức độ quan trọng, xác định cách thông báo tương tác với người dùng.
Sau khi tạo, kênh xuất hiện trong cài đặt thông báo hệ thống. Người dùng có thể thay đổi mức độ quan trọng, tắt âm thanh, rung hoặc chặn hoàn toàn kênh. Tất cả các thay đổi có hiệu lực ngay lập tức cho tất cả các thông báo tiếp theo.
Khi tạo NotificationChannel, bạn có thể cấu hình: âm thanh (tùy chỉnh hoặc hệ thống), rung (mẫu và thời gian), đèn báo (màu LED), biểu tượng huy hiệu (setShowBadge), màn hình khóa (setLockscreenVisibility) và chế độ không làm phiền (setBypassDnd). Các tham số này được cố định khi tạo kênh và chỉ có thể được thay đổi bởi người dùng sau đó.
Mức độ quan trọng là tham số chính của kênh. Nó xác định xem thông báo có phát âm thanh, xuất hiện trên màn hình hay chỉ được đặt trong bóng tối. Mức độ quan trọng không nên nhầm lẫn với ưu tiên — mức độ quan trọng do kênh đặt, và ưu tiên (setPriority) bị bỏ qua trên Android 8+.
| Mức | Hằng số | Hành vi | Âm thanh |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | Hiển thị biểu ngữ heads-up, xuất hiện trong bóng tối | Có |
| DEFAULT | IMPORTANCE_DEFAULT (3) | Xuất hiện trong bóng tối, không có heads-up | Có |
| LOW | IMPORTANCE_LOW (2) | Xuất hiện trong bóng tối không âm thanh | Không |
| MIN | IMPORTANCE_MIN (1) | Chỉ trong bóng tối, không âm thanh hoặc rung | Không |
| NONE | IMPORTANCE_NONE (0) | Không được hiển thị chút nào | Không |
Hầu hết các kịch bản người dùng, hãy sử dụng IMPORTANCE_DEFAULT (3) — thông báo sẽ xuất hiện trong bóng tối với âm thanh nhưng không có biểu ngữ pop-up. Sử dụng IMPORTANCE_HIGH chỉ cho các sự kiện quan trọng: cuộc gọi đến, tin nhắn từ liên hệ, lời nhắc hẹn giờ.
Kênh được tạo một lần khi ứng dụng khởi động hoặc khi sử dụng lần đầu. Thực hành tốt nhất là tạo tất cả các kênh khi khởi động ứng dụng, trong phương thức Application.onCreate. Việc tạo lại một kênh đã tồn tại là an toàn — Android sẽ bỏ qua lời gọi nếu kênh đã tồn tại.
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"Tin nhắn",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Thông báo tin nhắn mới"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"Khuyến mãi và tin tức",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Thông báo tiếp thị và ưu đãi đặc biệt"
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"
}
}
Khi gửi thông báo, hãy chỉ định ID kênh qua setChannelId (cho NotificationCompat) hoặc trong hàm tạo Notification.Builder. Nếu kênh với ID được chỉ định không tồn tại, thông báo sẽ không được hiển thị, nhưng sẽ không có lỗi nào xảy ra.
Android cung cấp một số API để quản lý kênh bằng mã: lấy danh sách, xóa và kiểm tra cài đặt hiện tại. Xóa một kênh sẽ khiến tất cả các thông báo của nó bị xóa khỏi lịch sử hệ thống.
val manager =
getSystemService(NotificationManager::class.java)
// Lấy danh sách tất cả kênh
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Kênh", "${channel.id}: ${channel.importance}")
}
// Biết mức độ quan trọng hiện tại (người dùng có thể đã thay đổi)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// Người dùng đã tắt kênh
suggestEnablingChannel()
}
// Xóa kênh
manager.deleteNotificationChannel(CHANNEL_PROMO)
Sau khi kênh được tạo, nhà phát triển không thể thay đổi mức độ quan trọng của nó bằng mã — đây là hạn chế của Android để bảo vệ người dùng khỏi lạm dụng. Nếu bạn cần thay đổi mức độ quan trọng của kênh, hãy tạo một kênh mới với ID khác và di chuyển các thông báo.
Nếu bạn cần thay đổi mức độ quan trọng của một kênh hiện có, hãy tạo một kênh mới với ID khác (ví dụ: “messages_v2”) và bắt đầu gửi thông báo đến nó. Kênh cũ có thể bị xóa qua deleteNotificationChannel — tất cả các thông báo của nó sẽ bị xóa khỏi lịch sử. Hãy cảnh báo người dùng về việc di chuyển qua giao diện ứng dụng để họ không mất cài đặt.
NotificationChannelGroup kết hợp nhiều kênh thành một nhóm trực quan trong giao diện cài đặt Android. Các nhóm giúp người dùng điều hướng khi ứng dụng sử dụng 5+ kênh: ví dụ, “Xã hội,” “Hệ thống,” “Tiếp thị.”
Một nhóm được tạo qua createNotificationChannelGroup và được truyền cho kênh khi tạo thông qua phương thức setGroup. Xóa một nhóm cũng xóa tất cả các kênh của nó. Mỗi kênh chỉ có thể thuộc về một nhóm.
Trong thực tế, các nhóm kênh được khuyến nghị cho các ứng dụng có hơn 3 kênh. Chúng đơn giản hóa việc điều hướng trong cài đặt và giảm khả năng người dùng tắt tất cả thông báo cùng một lúc mà không hiểu danh sách kênh.
Một nhóm được tạo qua createNotificationChannelGroup với ID và tên duy nhất. Sau đó, mỗi kênh được gán cho nhóm thông qua phương thức setGroup. Trong cài đặt hệ thống, nhóm xuất hiện dưới dạng một phần với tiêu đề, bên dưới là tất cả các kênh của nhóm này. Nếu một nhóm bị xóa, tất cả các kênh của nó cũng bị hệ thống tự động xóa mà không thể khôi phục.
Thiết kế kênh thông báo phù hợp ảnh hưởng trực tiếp đến trải nghiệm người dùng và khả năng giữ chân người dùng. Mẫu chính là ba mức độ quan trọng: kênh quan trọng (IMPORTANCE_HIGH) cho tin nhắn và cuộc gọi, tiêu chuẩn (IMPORTANCE_DEFAULT) cho thông báo chung và im lặng (IMPORTANCE_LOW) cho tiếp thị và tin tức. Sự phân cấp này cho người dùng một lựa chọn rõ ràng mà không quá tải.
Mẫu thứ hai là một kênh cho mỗi mô-đun chức năng. Mỗi mô-đun chính của ứng dụng (trò chuyện, đơn hàng, bảng tin, tiếp thị) có kênh riêng. Nếu có hơn 5 mô-đun, hãy kết hợp chúng thành một NotificationChannelGroup. Trong cài đặt hệ thống, nhóm xuất hiện dưới dạng một phần với các mục có thể thu gọn — điều này đơn giản hóa việc điều hướng.
Mẫu thứ ba là kênh nhà phát triển. Tạo một kênh riêng với IMPORTANCE_MIN cho các thông báo gỡ lỗi và dịch vụ. Người dùng sẽ không thấy chúng trong bóng tối, nhưng nhà phát triển có thể phân tích nhật ký qua adb. Trong môi trường Production, kênh này có thể bị xóa hoặc ẩn khỏi giao diện qua Intent trong cài đặt.
Mẫu thứ tư là phản hồi kênh. Hiển thị cho người dùng trong giao diện kênh nào đang hoạt động và mức độ quan trọng hiện tại của chúng. Trên Android 8+, bạn có thể lấy trạng thái kênh qua getNotificationChannel và đề nghị người dùng thay đổi cài đặt nếu kênh bị tắt. Điều này đặc biệt quan trọng đối với các chức năng quan trọng của ứng dụng.
Các câu hỏi thường gặp
Thông báo sẽ không được hiển thị trong bóng tối hoặc khay thông báo. Hệ thống im lặng bỏ qua lời gọi notify(). Ngoại lệ: khi sử dụng NotificationCompat, thư viện sẽ tạo một kênh mặc định, nhưng mức độ quan trọng của nó luôn là DEFAULT. Luôn được khuyến nghị tạo các kênh của riêng bạn.
Bạn có thể thay đổi tên, mô tả và âm thanh của kênh. Bạn không thể thay đổi mức độ quan trọng — quyết định này được hệ thống bảo vệ khỏi nhà phát triển. Nếu bạn cần tăng mức độ quan trọng, hãy tạo một kênh mới với ID khác và sử dụng nó cho các thông báo mới. Người dùng có thể thay đổi mức độ quan trọng bất kỳ lúc nào.
Sử dụng getNotificationChannel và kiểm tra mức độ quan trọng: nếu giá trị là IMPORTANCE_NONE, kênh đã bị tắt. Bạn cũng có thể mở cài đặt hệ thống của kênh qua Intent: Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS với các tham số app_package và channel_id.
Không có giới hạn — Android không đặt giới hạn về số lượng kênh. Tuy nhiên, khuyến nghị không tạo quá 5–10 kênh để tránh làm người dùng choáng ngợp với các lựa chọn. Mức tối thiểu tối ưu là 2–3 kênh: thông báo quan trọng, thông thường và tiếp thị.
Trên Android 7.1 (API 25) trở xuống, các kênh không được hỗ trợ. Lớp NotificationChannel chỉ khả dụng từ API 26. Để tương thích ngược, hãy sử dụng NotificationCompat và bọc việc tạo kênh trong điều kiện: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O).
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm