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

Kể từ Android 8.0 (API cấp 26), mọi thông báo phải được gán cho một của bạn. Đố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 đồng thời quyết định kênh thông báo nào từ ứng dụng của bạn 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ề kênh và các thông báo khác trong Android 8.0.

Cài đặt người dùng cho kênh thông báo có sẵn cho mỗi ứng dụng trong các chế độ cài đặt hệ thống, như minh hoạ trong Hình 1.

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

Sau khi tạo kênh thông báo, bạn không thể thay đổi thông báo này của Google. Người dùng có toàn quyền kiểm soát tại thời điểm đó. 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 từng loại thông báo 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 trò chuyện được tạo bằng trong một ứ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 kênh thông báo khác. Nếu bạn đặt targetSdkVersion thành 25 trở xuống, 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 như nhau như trên 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 dễ thấy cho người dùng và mức độ quan trọng.

  2. Nếu muốn, hãy chỉ định nội dung mô tả mà người dùng nhìn thấy trong phần cài đặt hệ thống thông qua tính năng setDescription().

  3. Đăng ký kênh thông báo bằng cách chuyể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 một kênh thông báo hiện có bằng các giá trị ban đầu sẽ không mang lại hiệu quả , nên có thể gọi mã này khi khởi động ứng dụng.

Theo mặc định, tất cả thông báo đăng lên một kênh cụ thể đều sử dụng hình ảnh và hành vi thính giác được xác định theo mức độ quan trọng từ NotificationManagerCompat lớp, 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 bạn muốn tuỳ chỉnh thêm 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(), và setVibrationPattern() vào NotificationChannel. Xin nhớ rằng sau khi tạo kênh, bạn không thể thay đổi các 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 đang hoạt độ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 đang gọi createNotificationChannels().

Đặt 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 mọi thông báo đăng trong kênh. Chỉ định mã này trong hàm khởi tạo NotificationChannel bằng một trong 5 mức độ quan trọng, từ IMPORTANCE_NONE(0) đến IMPORTANCE_HIGH(4).

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

Tầm quan trọng (NotificationManager.IMPORTANCE_*) và mức độ ưu tiên Hằng số (NotificationCompat.PRIORITY_*) liên kết với tầm quan trọng mà người dùng thấy được như được minh hoạ trong bảng sau.

Mức độ quan trọng mà người dùng thấy được 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
Phát â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 trên thanh trạng thái.
IMPORTANCE_MIN PRIORITY_MIN
Không có
Không phát ra â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

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

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

Để biết thông tin về cách chọn mức độ ưu tiên thích hợp, hãy xem phần "Mức độ ưu tiên cấp" 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 của các kênh thông báo, bao gồm cả các hành vi chẳng hạn như âm thanh rung và cảnh báo. Nếu bạn muốn biết các 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 một chế độ cài đặt của kênh mà bạn cho rằng ngăn cản hành vi dự định cho ứng dụng của bạn, bạn có thể đề xuất người dùng thay đổi cài đặt đó và đưa ra hành động để 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 thông báo này hành vi trực quan và thính giác của kênh 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. Để cung cấp cho người dùng dễ dàng truy cập các cài đặt thông báo này, thêm một mục vào giao diện người dùng cài đặt, nơi mở ra 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 Intent sử dụng thuộc tính ACTION_CHANNEL_NOTIFICATION_SETTINGS hành động.

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 chế độ 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);

Lưu ý ý định 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 điện 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 hơn nữa 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 của bạn hỗ trợ nhiều tài khoản người dùng, chẳng hạn như hồ sơ công việc, vì tính năng này cho phép bạn tạ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. Cài đặt kênh thông báo với 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ợ cho mục đích cá nhân và công việc tài khoản. Trong trường hợp này, mỗi tài khoản có thể yêu cầu nhiều thông báo các kênh có chức năng và tên giống 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

  • Một 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 từng tài khoản cho phép người dùng hãy phân biệt chúng.

Mỗi nhóm kênh thông báo đều yêu cầu một mã nhận dạng duy nhất trong gói cũng như tên hiển thị cho người dùng. Đ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 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 giữa nhóm thông báo và kênh thông báo.