[Android O] Phần 3: Notification Channels (Kênh thông báo)

Trước mắt, để có thể sử dụng các tính năng mới của phiên bản Android O, các bạn tham khảo bài viết trước của mình tại Android O Phần 2: Migrating ứng dụng sang Android O Ở bài viết này mình sẽ giới thiệu cách sử dụng 1 tính năng nổi bật mới của Android O là Notification Channels (Kênh thông báo) Trong Android O, Google giới thiệu thêm Notification Channel, nó sẽ chia thông báo làm nhiều "kênh" khác nhau và người dùng được chọn kênh mà mình muốn xem, những kênh khác sẽ không có quyền hiện ra. Bạn cũng có thể gộp các thông báo trên Android O theo từng nhóm ứng dụng và tương tác với nó cùng một lúc. Khi bạn nhắm đến Android O, bạn phải triển khai một hoặc nhiều kênh thông báo cho người dùng của mình, ngược lại nếu bạn không nhắm mục tiêu đến Android O, ứng dụng của bạn sẽ hoạt động bình thường như ứng dụng trên Android 7.0

Tạo 1 Kênh thông báo

Để tạo 1 kênh thông báo:

  1. Khởi tạo 1 object kênh thông báo với 1 ID duy nhất trong package của bạn
  2. Cấu hình các thông số mặc định của object mà bạn mong muốn như: Âm thanh cảnh báo, mô tả tùy chọn cách hiển thị cho người dùng
  3. Submit object tới Notification Manager
class MainActivity : AppCompatActivity() {
    private var mNotificationManager: NotificationManager? = null
    private val CHANNEL_ID_1 = "my_channel_01"
    private var notifyID = 1

    @SuppressLint("NewApi")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initNotificationChannel(CHANNEL_ID_1)
        pushNotification(CHANNEL_ID_1)
    }


    @TargetApi(Build.VERSION_CODES.O)
    private fun pushNotification(channelID: String) {
        mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        val notification = Notification.Builder([email protected])
                .setContentTitle("Title by $channelID")
                .setContentText("Message by $channelID")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setChannel(channelID)
                .build()
        // Issue the notification.
        mNotificationManager!!.notify(notifyID, notification)
        notifyID++
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private fun initNotificationChannel(channelID: String) {
        mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        // The user visible name of the channel.
        val name = getString(R.string.channel_name) + " " + channelID
        val importance = NotificationManager.IMPORTANCE_LOW
        val mChannel = NotificationChannel(channelID, name, importance)
        // Configure the notification channel.
        mChannel.enableLights(true)
        // Sets the notification light color for notifications posted to this
        // channel, if the device supports this feature.
        mChannel.lightColor = Color.RED
        mChannel.enableVibration(true)
        mChannel.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400)
        mNotificationManager!!.createNotificationChannel(mChannel)
    }
}
    

Bạn cũng có thể gọi nhiều kênh thông báo riêng lẻ bằng cách gọi createNotificationChannels().

Tạo 1 nhóm Kênh thông báo

Nếu ứng dụng của bạn hỗ trợ nhiều tài khoản người dùng, bạn có thể tạo một nhóm kênh thông báo cho mỗi tài khoản. Các nhóm kênh thông báo cho phép bạn quản lý nhiều kênh thông báo có tên giống nhau trong một ứng dụng. Ví dụ: ứng dụng mạng xã hội có thể bao gồm hỗ trợ cho tài khoản cá nhân, cũng như tài khoản người dùng doanh nghiệp. Trong trường hợp này, mỗi tài khoản người dùng có thể yêu cầu nhiều kênh thông báo với các chức năng và tên giống nhau.

Để tạo 1 nhóm kênh thông báo:

    private val GROUP_ID_1 = "my_group_01"
  
    @TargetApi(Build.VERSION_CODES.O)
    private fun initNotificationChannelGroup(groupID: String) {
        mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        // The user visible name of the group.
        val name = getString(R.string.group_name) + " " + groupID
        mNotificationManager!!.createNotificationChannelGroup(NotificationChannelGroup(groupID, name))
    }
    
    @TargetApi(Build.VERSION_CODES.O)
    private fun pushNotification(groupID: String) {
        mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        val notification = Notification.Builder([email protected])
                .setContentTitle("Title by group $groupID")
                .setContentText("Message by group $groupID")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setGroup(groupID)
                .build()
        // Issue the notification.
        mNotificationManager!!.notify(notifyID, notification)
        notifyID++
    }
 

Bạn cũng có thể kết hợp cả channelID cùng với groupID

TargetApi(Build.VERSION_CODES.O)
    private fun pushNotification(channelID: String, groupID: String) {
        mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        val notification = Notification.Builder([email protected])
                .setContentTitle("Title $channelID $groupID")
                .setContentText("Message $channelID $groupID")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setChannel(channelID)
                .setGroup(groupID)
                .build()
        // Issue the notification.
        mNotificationManager!!.notify(notifyID, notification)
        notifyID++
    }

Đọc các thiết lập của Kênh thông báo

Người dùng có thể sửa đổi cài đặt cho các kênh thông báo, bao gồm các trạng thái như rung và âm thanh cảnh báo. Bạn có thể gọi hai phương pháp sau để khám phá các cài đặt mà người dùng đã áp dụng cho một kênh thông báo:

  • Để truy xuất một kênh thông báo, bạn có thể gọi getNotificationChannel().
  • Để truy xuất tất cả các kênh thông báo thuộc về ứng dụng của bạn, bạn có thể gọi getNotificationChannels().

Cập nhật thiết lập Kênh thông báo

Khi bạn tạo kênh thông báo, người dùng chịu trách nhiệm về các cài đặt và hành vi của nó. Bạn có thể gọi lại createNotificationChannel () để đổi tên kênh thông báo hiện tại hoặc cập nhật mô tả của nó. Đoạn code sau đây mô tả cách bạn có thể chuyển hướng người dùng đến cài đặt cho kênh thông báo.

        val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
        intent.putExtra(Settings.EXTRA_CHANNEL_ID, CHANNEL_ID_1)
        intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
        startActivity(intent)

Xóa Kênh thông báo

Bạn có thể xóa các kênh thông báo bằng cách gọi deleteNotificationChannel (). Cài đặt thông báo hiển thị số kênh đã xóa, như một cơ chế ngăn chặn spam. Bạn có thể xóa các kênh thử nghiệm trên thiết bị phát triển: bằng cách cài đặt lại ứng dụng hoặc bằng cách xóa dữ liệu được liên kết với bản sao của ứng dụng.

    @TargetApi(Build.VERSION_CODES.O)
    private fun deleteNotificationChannel(channelID: String) {
        mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        mNotificationManager!!.deleteNotificationChannel(channelID)
    }
    
    @TargetApi(Build.VERSION_CODES.O)
     private fun deleteNotificationChannelGroup(groupId: String) {
        mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        mNotificationManager!!.deleteNotificationChannelGroup(groupId)
    }

Kết luận

Hiện tại thời điểm này, Android O vẫn đang là thử nghiệm song với tính năng mới Kênh thông báo này thực sự rất hữu ích và tạo 1 trải nghiệm mới cho người dùng. Ở bài viết mình đang sử dụng Kotlin để test thử, mọi người có thể tham khảo java cũng như bài viết nguồn tại: https://developer.android.com/preview/features/notification-channels.html Mình dịch có thể chưa được chuẩn hoặc đọc ngang ngang, mong mọi người góp ý 😄