Tạo và quản lý các kênh thông báo

Kể từ Android 8.0 (API cấp 26), bạn phải chỉ định kênh cho tất cả thông báo. Đối với mỗi kênh, bạn có thể đặt hành vi về thị giác và thính giác được áp dụng cho tất cả thông báo trong kênh đó. Người dùng có thể thay đổi các chế độ cài đặt này và quyết định kênh thông báo nào của ứng dụng có thể gây phiền toái hoặc hiển thị.

Hãy xem video sau đây để nắm được thông tin tổng quan về các kênh và những tính năng thông báo khác trong Android 8.0.

Người dùng có thể truy cập vào phần cài đặt kênh thông báo cho từng ứng dụng trong phần cài đặt hệ thống, như minh hoạ trong hình 1.

Hình 1. Các chế độ cài đặt thông báo của ứng dụng Đồng hồ và một trong các kênh thông báo của ứng dụng đó.

Sau khi tạo kênh thông báo, bạn không thể thay đổi hành vi thông báo. Lúc đó, người dùng có toàn quyền kiểm soát. Tuy nhiên, bạn vẫn có thể thay đổi tên và nội dung mô tả của kênh.

Tạo một kênh cho mỗi loại thông báo mà bạn cần gửi. Bạn cũng có thể tạo các kênh thông báo để phản ánh lựa chọn của người dùng. Ví dụ: bạn có thể thiết lập các kênh thông báo riêng cho từng nhóm cuộc trò chuyện do người dùng tạo trong ứng dụng nhắn tin.

Khi nhắm đến Android 8.0 (API cấp 26) trở lên, bạn phải triển khai một hoặc nhiều kênh thông báo. Nếu targetSdkVersion được đặt thành 25 trở xuống, thì khi ứng dụng của bạn chạy trên Android 8.0 (API cấp 26) trở lên, ứng dụng sẽ hoạt động giống như trên các thiết bị chạy Android 7.1 (API cấp 25) trở xuống.

Tạo kênh thông báo

Để tạo một kênh thông báo, hãy làm theo các bước sau:

  1. Tạo một đối tượng NotificationChannel có mã kênh riêng biệt, tên mà người dùng nhìn thấy và mức độ quan trọng.

  2. Bạn có thể chỉ định nội dung mô tả mà người dùng thấy trong phần cài đặt hệ thống bằng setDescription().

  3. Đăng ký kênh thông báo bằng cách truyền kênh đó đến createNotificationChannel().

Ví dụ sau đây cho biết cách tạo và đăng ký một kênh thông báo:

Kotlin

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the NotificationChannel.
    val name = getString(R.string.channel_name)
    val descriptionText = getString(R.string.channel_description)
    val importance = NotificationManager.IMPORTANCE_DEFAULT
    val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
    mChannel.description = descriptionText
    // Register the channel with the system. You can't change the importance
    // or other notification behaviors after this.
    val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannel(mChannel)
}

Java

private void createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is not in the Support Library.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        // Register the channel with the system. You can't change the importance
        // or other notification behaviors after this.
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

Việc tạo lại một kênh thông báo hiện có bằng các giá trị ban đầu sẽ không thực hiện thao tác nào, vì vậy, bạn có thể gọi mã này một cách an toàn khi khởi động ứng dụng.

Theo mặc định, tất cả thông báo được đăng lên một kênh nhất định đều sử dụng các hành vi về thị giác và thính giác do cấp độ quan trọng xác định từ lớp NotificationManagerCompat, chẳng hạn như IMPORTANCE_DEFAULT hoặc IMPORTANCE_HIGH. Hãy xem phần tiếp theo để biết thêm thông tin về các mức độ quan trọng.

Nếu muốn tuỳ chỉnh thêm các hành vi thông báo mặc định của kênh, bạn có thể gọi các phương thức như enableLights(), setLightColor()setVibrationPattern() trên NotificationChannel. Xin lưu ý rằng sau khi tạo kênh, bạn không thể thay đổi các chế độ cài đặt này và người dùng có quyền kiểm soát cuối cùng đối với việc các hành vi này có hoạt động hay không.

Bạn cũng có thể tạo nhiều kênh thông báo trong một thao tác bằng cách gọi createNotificationChannels().

Đặt mức độ quan trọng

Mức độ quan trọng của kênh ảnh hưởng đến mức độ gián đoạn của tất cả thông báo được đăng trong kênh. Chỉ định trong hàm khởi tạo NotificationChannel, bằng cách sử dụng một trong 5 cấp độ quan trọng, từ IMPORTANCE_NONE(0) đến IMPORTANCE_HIGH(4).

Để hỗ trợ các thiết bị chạy Android 7.1 (API cấp 25) trở xuống, bạn cũng phải gọi setPriority() cho từng thông báo, bằng cách sử dụng hằng số ưu tiên từ lớp NotificationCompat.

Các hằng số mức độ quan trọng (NotificationManager.IMPORTANCE_*) và mức độ ưu tiên (NotificationCompat.PRIORITY_*) liên kết với các lựa chọn mức độ quan trọng mà người dùng nhìn thấy, như minh hoạ trong bảng sau.

Mức độ quan trọng mà người dùng nhìn thấy Mức độ quan trọng (Android 8.0 trở lên) Mức độ ưu tiên (Android 7.1 trở xuống)
Khẩn cấp
Thông báo xuất hiện dưới dạng thông báo quan trọng và có âm thanh.
IMPORTANCE_HIGH PRIORITY_HIGH hoặc PRIORITY_MAX
Cao
Có âm thanh.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Trung bình
Không phát ra âm thanh.
IMPORTANCE_LOW PRIORITY_LOW
Thấp
Không phát âm thanh và không xuất hiện trong thanh trạng thái.
IMPORTANCE_MIN PRIORITY_MIN
Không có
Không phát âm thanh và không xuất hiện trong thanh trạng thái hoặc ngăn thông báo.
IMPORTANCE_NONE N/A

Bất kể mức độ quan trọng là gì, tất cả thông báo đều xuất hiện ở các vị trí không gây gián đoạn trong giao diện người dùng hệ thống, chẳng hạn như ở ngăn thông báo và dưới dạng huy hiệu trên biểu tượng trình chạy, mặc dù bạn có thể sửa đổi giao diện của huy hiệu thông báo.

Sau khi gửi kênh đến NotificationManager, bạn sẽ không thể thay đổi mức độ quan trọng. Tuy nhiên, người dùng có thể thay đổi lựa chọn ưu tiên của họ cho các kênh của ứng dụng bất cứ lúc nào.

Để biết thông tin về cách chọn mức độ ưu tiên phù hợp, hãy xem phần "Mức độ ưu tiên" trong Hướng dẫn thiết kế thông báo.

Đọc chế độ cài đặt kênh thông báo

Người dùng có thể sửa đổi chế độ cài đặt cho các kênh thông báo, bao gồm cả các hành vi như rung và âm thanh cảnh báo. Nếu bạn muốn biết những chế độ cài đặt mà người dùng áp dụng cho các kênh thông báo của bạn, hãy làm theo các bước sau:

  1. Lấy đối tượng NotificationChannel bằng cách gọi getNotificationChannel() hoặc getNotificationChannels().

  2. Truy vấn các chế độ cài đặt kênh cụ thể, chẳng hạn như getVibrationPattern(), getSound()getImportance().

Nếu phát hiện thấy một chế độ cài đặt kênh mà bạn cho rằng sẽ ngăn chặn hành vi dự kiến của ứng dụng, bạn có thể đề xuất người dùng thay đổi chế độ cài đặt đó và cung cấp một thao tác để mở phần cài đặt kênh, như minh hoạ trong phần tiếp theo.

Mở phần cài đặt kênh thông báo

Sau khi tạo kênh thông báo, bạn không thể thay đổi hành vi thị giác và thính giác của kênh thông báo theo phương thức lập trình. Chỉ người dùng mới có thể thay đổi hành vi của kênh trong phần cài đặt hệ thống. Để giúp người dùng dễ dàng truy cập vào các chế độ cài đặt thông báo này, hãy thêm một mục vào giao diện người dùng cài đặt của ứng dụng để mở các chế độ cài đặt hệ thống này.

Bạn có thể mở chế độ cài đặt hệ thống cho các kênh thông báo bằng một Intent sử dụng thao tác ACTION_CHANNEL_NOTIFICATION_SETTINGS.

Ví dụ: mã mẫu sau đây cho biết cách bạn có thể chuyển hướng người dùng đến phần cài đặt cho một kênh thông báo:

Kotlin

val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
    putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
}
startActivity(intent)

Java

Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId());
startActivity(intent);

Xin lưu ý rằng ý định này yêu cầu 2 phần bổ sung chỉ định tên gói của ứng dụng (còn gọi là mã nhận dạng ứng dụng) và kênh cần chỉnh sửa.

Xoá kênh thông báo

Bạn có thể xoá các kênh thông báo bằng cách gọi deleteNotificationChannel(). Mã mẫu sau đây minh hoạ cách hoàn tất quy trình này:

Kotlin

// The id of the channel.
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val id: String = "my_channel_01"
notificationManager.deleteNotificationChannel(id)

Java

NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
notificationManager.deleteNotificationChannel(id);

Tạo một nhóm kênh thông báo

Nếu muốn sắp xếp thêm giao diện của các kênh trong giao diện người dùng cài đặt, bạn có thể tạo nhóm kênh. Đây là một ý tưởng hay khi ứng dụng của bạn hỗ trợ nhiều tài khoản người dùng, chẳng hạn như cho hồ sơ công việc, vì ý tưởng này cho phép bạn tạo một nhóm kênh thông báo cho mỗi tài khoản. Bằng cách này, người dùng có thể dễ dàng xác định và kiểm soát nhiều kênh thông báo có tên giống nhau.

Hình 2. Chế độ cài đặt kênh thông báo theo nhóm cho tài khoản cá nhân và tài khoản công việc.

Ví dụ: một ứng dụng mạng xã hội có thể hỗ trợ tài khoản cá nhân và tài khoản công việc. Trong trường hợp này, mỗi tài khoản có thể yêu cầu nhiều kênh thông báo có chức năng và tên giống nhau, chẳng hạn như:

  • Tài khoản cá nhân có hai kênh:

    • Bình luận mới

    • Đề xuất về bài đăng

  • Một tài khoản doanh nghiệp có hai kênh:

    • Bình luận mới

    • Đề xuất về bài đăng

Việc sắp xếp các kênh thông báo thành nhóm cho từng tài khoản giúp người dùng phân biệt các kênh thông báo.

Mỗi nhóm kênh thông báo đều cần có một mã nhận dạng riêng biệt trong gói của bạn, cũng như một tên mà người dùng có thể nhìn thấy. Đoạn mã sau đây minh hoạ cách tạo một nhóm kênh thông báo.

Kotlin

// The id of the group.
val groupId = "my_group_01"
// The user-visible name of the group.
val groupName = getString(R.string.group_name)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))

Java

// The id of the group.
String groupId = "my_group_01";
// The user-visible name of the group.
CharSequence groupName = getString(R.string.group_name);
NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));

Sau khi tạo một nhóm mới, bạn có thể gọi setGroup() để liên kết một đối tượng NotificationChannel mới với nhóm.

Sau khi gửi kênh đến trình quản lý thông báo, bạn không thể thay đổi mối liên kết giữa kênh thông báo và nhóm.