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 mọi thông báo cho một kênh. Đối với mỗi kênh, bạn có thể đặt hành vi hình ảnh 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 từ ứng dụng có thể xâm nhập hoặc hiển thị.

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

Chế độ cài đặt người dùng cho các kênh thông báo có sẵn cho mỗi ứ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 cho ứng dụng Đồng hồ và một trong các kênh của ứng dụng này.

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

Tạo một kênh cho từng loại thông báo mà bạn cần gửi. Bạn cũng có thể tạo kênh thông báo để phản ánh các 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 bạn đặt targetSdkVersion thành 25 trở xuống, thì khi ứng dụng 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 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ã nhận dạng kênh duy nhất, tên hiển thị cho người dùng và mức độ quan trọng.

  2. Nếu muốn, hãy chỉ định thông tin mô tả mà người dùng nhìn 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 trình bày cách tạo và đăng ký 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 kênh thông báo hiện có bằng các giá trị ban đầu không thực hiện thao tác nào. Vì vậy, bạn có thể an toàn gọi mã này 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 hành vi hình ảnh và thính giác được xác định theo mức độ quan trọng trong lớp NotificationManagerCompat, chẳng hạn như IMPORTANCE_DEFAULT hoặc IMPORTANCE_HIGH. Xem phần tiếp theo để biết thêm thông tin về mức độ quan trọng.

Nếu muốn tuỳ chỉnh thêm hoạt động thông báo mặc định trên kênh của mình, bạn có thể gọi các phương thức như enableLights(), setLightColor()setVibrationPattern() trên NotificationChannel. Hãy nhớ 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().

Thiết lập mức độ quan trọng

Tầm quan trọng của kênh ảnh hưởng đến mức độ gián đoạn của tất cả các thông báo được đăng trong kênh. Hãy chỉ định thuộc tính này trong hàm khởi tạo NotificationChannel, sử dụng một trong 5 mức độ 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 tuỳ chọn mức độ quan trọng mà người dùng có thể nhìn thấy, như minh hoạ trong bảng sau.

Mức độ quan trọng mà người dùng có thể nhận thấy Tầm quan trọng (Android 8.0 trở lên) Mức độ ưu tiên (Android 7.1 trở xuống)
Khẩn cấp
Có âm thanh và xuất hiện dưới dạng thông báo quan trọng.
IMPORTANCE_HIGH PRIORITY_HIGH hoặc PRIORITY_MAX
Cao
Phát ra â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.
IMPORTANCE_NONE N/A

Tất cả thông báo, bất kể mức độ quan trọng, đều xuất hiện tại các vị trí giao diện người dùng không gây gián đoạn của hệ thống, chẳng hạn như trong 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 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ọ đối với các kênh trong ứ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 "Các mức độ ưu tiên" trong phần 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ư âm thanh rung và cảnh báo. Nếu bạn muốn biết chế độ cài đặt mà người dùng áp dụng cho các kênh thông báo, 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 cụ thể của kênh, chẳng hạn như getVibrationPattern(), getSound()getImportance().

Nếu phát hiện một chế độ cài đặt kênh mà bạn cho rằng sẽ cản trở 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à đưa ra một thao tác để mở chế độ cài đặt kênh, như minh hoạ trong phần tiếp theo.

Mở 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 hình ảnh 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 trong 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ở phần 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 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 dữ liệu bổ sung chỉ định tên gói của ứng dụng (còn gọi là mã ứ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 nhóm kênh thông báo

Nếu muốn sắp xếp thêm giao diện của kênh trong giao diện người dùng cài đặt, bạn có thể tạo các nhóm kênh. Đây là ý tưởng hay khi ứng dụng hỗ trợ nhiều tài khoản người dùng, chẳng hạn như hồ sơ công việc, vì ứng dụ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 hệt nhau.

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

Ví dụ: ứ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 hệt nhau, chẳng hạn như sau:

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

    • Bình luận mới

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

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

    • Bình luận mới

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

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

Mỗi nhóm kênh thông báo yêu cầu một mã nhận dạng. Mã này phải là duy nhất trong gói của bạn, cũng như tên mà người dùng nhìn thấy. Đoạn mã sau đây minh hoạ cách tạo 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 nhóm và kênh thông báo.