สร้างและจัดการช่องทางการแจ้งเตือน

เริ่มตั้งแต่ Android 8.0 (API ระดับ 26) เป็นต้นไป การแจ้งเตือนทั้งหมดจะต้องมีการกำหนดให้แก่ช่องทาง คุณสามารถตั้งค่าลักษณะการทำงานด้านภาพและเสียงสำหรับแต่ละช่องได้ ซึ่งจะ ใช้กับการแจ้งเตือนทั้งหมดในช่องนั้น ผู้ใช้สามารถเปลี่ยนการตั้งค่าเหล่านี้ และตัดสินใจได้ว่าช่องทางการแจ้งเตือนใดจากแอปของคุณที่อาจรบกวนหรือ มองเห็นได้

ดูภาพรวมของช่องและฟีเจอร์การแจ้งเตือนอื่นๆ ใน Android 8.0 ได้ในวิดีโอต่อไปนี้

การตั้งค่าผู้ใช้สำหรับช่องทางการแจ้งเตือนจะพร้อมใช้งานสำหรับแต่ละแอปในการตั้งค่าระบบ ดังที่แสดงในรูปที่ 1

รูปที่ 1 การตั้งค่าการแจ้งเตือนสำหรับแอปนาฬิกา และช่องทางหนึ่งของแอปนั้น

หลังจากสร้างแชแนลการแจ้งเตือนแล้ว คุณจะเปลี่ยนลักษณะการทำงานของการแจ้งเตือนไม่ได้ ผู้ใช้จะมีสิทธิ์ควบคุมอย่างเต็มที่ในจุดนั้น อย่างไรก็ตาม คุณยังคงเปลี่ยนชื่อและคำอธิบายของช่องได้

สร้างแชแนลสำหรับการแจ้งเตือนแต่ละประเภทที่คุณต้องการส่ง นอกจากนี้ คุณยังสร้างช่องทางการแจ้งเตือนเพื่อแสดงตัวเลือกที่ผู้ใช้เลือกได้ด้วย เช่น คุณสามารถตั้งค่าช่องทางการแจ้งเตือนแยกต่างหากสำหรับแต่ละกลุ่มการสนทนาแต่ละกลุ่มที่ผู้ใช้สร้างขึ้นในแอปรับส่งข้อความ

เมื่อกำหนดเป้าหมายเป็น Android 8.0 (API ระดับ 26) ขึ้นไป คุณต้องใช้ช่องทางการแจ้งเตือนอย่างน้อย 1 ช่อง หาก targetSdkVersion ตั้งค่าเป็น 25 หรือต่ำกว่า เมื่อแอปทำงานบน Android 8.0 (API ระดับ 26) ขึ้นไป แอปจะทำงานเหมือนกับ ในอุปกรณ์ที่ใช้ Android 7.1 (API ระดับ 25) หรือต่ำกว่า

สร้างช่องทางการแจ้งเตือน

หากต้องการสร้างแชแนลการแจ้งเตือน ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างออบเจ็กต์ NotificationChannel โดยใช้รหัสแชแนลที่ไม่ซ้ำกัน ชื่อที่ผู้ใช้มองเห็น และระดับความสำคัญ

  2. (ไม่บังคับ) ระบุคำอธิบายที่ผู้ใช้เห็นในการตั้งค่าระบบ ด้วย setDescription()

  3. ลงทะเบียนช่องทางการแจ้งเตือนโดยส่งไปยัง createNotificationChannel()

ตัวอย่างต่อไปนี้แสดงวิธีสร้างและลงทะเบียนช่องการแจ้งเตือน

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);
    }
}

การสร้างแชแนลการแจ้งเตือนที่มีอยู่ซ้ำโดยใช้ค่าเดิมจะไม่ ดำเนินการใดๆ ดังนั้นจึงเรียกใช้โค้ดนี้ได้อย่างปลอดภัยเมื่อเริ่มต้นแอป

โดยค่าเริ่มต้น การแจ้งเตือนทั้งหมดที่โพสต์ในแชแนลหนึ่งๆ จะใช้ลักษณะการทำงานด้านภาพและเสียงที่กำหนดโดยระดับความสำคัญจากคลาส NotificationManagerCompat เช่น IMPORTANCE_DEFAULT หรือ IMPORTANCE_HIGH ดูข้อมูลเพิ่มเติมเกี่ยวกับระดับความสำคัญได้ในส่วนถัดไป

หากต้องการปรับแต่งลักษณะการทำงานของการแจ้งเตือนเริ่มต้นของช่องเพิ่มเติม คุณสามารถเรียกใช้เมธอดต่างๆ เช่น enableLights() setLightColor() และ setVibrationPattern() ใน NotificationChannel โปรดทราบว่าเมื่อสร้างช่องแล้ว คุณจะเปลี่ยนการตั้งค่าเหล่านี้ไม่ได้ และผู้ใช้จะมีสิทธิ์ควบคุมขั้นสุดท้ายว่าจะเปิดใช้ลักษณะการทำงานเหล่านี้หรือไม่

นอกจากนี้ คุณยังสร้างช่องทางการแจ้งเตือนหลายช่องในการดำเนินการเดียวได้โดยการเรียกใช้ createNotificationChannels()

ตั้งค่าระดับความสำคัญ

ความสำคัญของช่องจะส่งผลต่อระดับการรบกวนของการแจ้งเตือนทั้งหมดที่โพสต์ใน ช่อง ระบุในตัวสร้าง NotificationChannel โดยใช้ระดับความสำคัญระดับใดระดับหนึ่งจาก 5 ระดับ ซึ่งมีตั้งแต่ IMPORTANCE_NONE(0) ไปจนถึง IMPORTANCE_HIGH(4)

หากต้องการรองรับอุปกรณ์ที่ใช้ Android 7.1 (API ระดับ 25) หรือต่ำกว่า คุณต้องเรียกใช้ setPriority() สำหรับการแจ้งเตือนแต่ละรายการด้วย โดยใช้ค่าคงที่ลำดับความสำคัญจากคลาส NotificationCompat

ค่าคงที่ความสำคัญ (NotificationManager.IMPORTANCE_*) และลำดับความสำคัญ (NotificationCompat.PRIORITY_*) จะแมปกับตัวเลือกความสำคัญ ที่ผู้ใช้มองเห็น ดังที่แสดงในตารางต่อไปนี้

ระดับความสำคัญที่ผู้ใช้มองเห็น ความสำคัญ (Android 8.0 ขึ้นไป) ลำดับความสำคัญ (Android 7.1 และต่ำกว่า)
ด่วน
มีเสียงเตือนและแสดงเป็นการแจ้งเตือนล่วงหน้า
IMPORTANCE_HIGH PRIORITY_HIGH หรือ PRIORITY_MAX
สูง
มีเสียงเตือน
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
ปานกลาง
ไม่มีเสียง
IMPORTANCE_LOW PRIORITY_LOW
ต่ำ
ไม่มีเสียงเตือนและไม่ปรากฏในแถบสถานะ
IMPORTANCE_MIN PRIORITY_MIN
ไม่มี
ไม่มีเสียงและไม่ปรากฏในแถบสถานะหรือเฉดสี
IMPORTANCE_NONE N/A

การแจ้งเตือนทั้งหมดไม่ว่าจะมีความสำคัญระดับใดจะปรากฏในตำแหน่ง UI ของระบบที่ไม่ก่อให้เกิดการรบกวน เช่น ในลิ้นชักการแจ้งเตือนและป้ายบนไอคอน Launcher แต่คุณจะ ปรับเปลี่ยนลักษณะที่ปรากฏของป้ายแสดงการแจ้งเตือนได้

เมื่อส่งช่องไปยัง NotificationManagerแล้ว คุณจะเปลี่ยนระดับความสำคัญไม่ได้ อย่างไรก็ตาม ผู้ใช้สามารถเปลี่ยนค่ากำหนดสำหรับช่องของแอปได้ทุกเมื่อ

ดูข้อมูลเกี่ยวกับการเลือกลำดับความสำคัญที่เหมาะสมได้ที่ "ระดับความสำคัญ" ในคู่มือการออกแบบการแจ้งเตือน

อ่านการตั้งค่าแชแนลการแจ้งเตือน

ผู้ใช้สามารถแก้ไขการตั้งค่าสำหรับช่องทางการแจ้งเตือนได้ รวมถึงลักษณะการทำงาน เช่น การสั่นและเสียงแจ้งเตือน หากต้องการทราบการตั้งค่าที่ผู้ใช้ ใช้กับช่องการแจ้งเตือนของคุณ ให้ทำตามขั้นตอนต่อไปนี้

  1. รับออบเจ็กต์ NotificationChannel โดยการเรียกใช้ getNotificationChannel() หรือ getNotificationChannels()

  2. ค้นหาการตั้งค่าช่องที่เฉพาะเจาะจง เช่น getVibrationPattern() getSound() และ getImportance()

หากตรวจพบการตั้งค่าช่องที่คุณเชื่อว่าขัดขวางลักษณะการทำงานที่ต้องการ สำหรับแอป คุณสามารถแนะนำให้ผู้ใช้เปลี่ยนการตั้งค่าดังกล่าวและระบุการดำเนินการเพื่อ เปิดการตั้งค่าช่องได้ ดังที่แสดงในส่วนถัดไป

เปิดการตั้งค่าแชแนลการแจ้งเตือน

หลังจากสร้างแชแนลการแจ้งเตือนแล้ว คุณจะเปลี่ยนลักษณะการทำงานด้านภาพและเสียงของแชแนลการแจ้งเตือนโดยใช้โปรแกรมไม่ได้ มีเพียงผู้ใช้เท่านั้นที่ เปลี่ยนลักษณะการทำงานของช่องได้จากการตั้งค่าระบบ หากต้องการให้ผู้ใช้เข้าถึงการตั้งค่าการแจ้งเตือนเหล่านี้ได้ง่ายๆ ให้เพิ่มรายการในUI การตั้งค่าของแอปที่เปิดการตั้งค่าระบบเหล่านี้

คุณเปิดการตั้งค่าระบบสำหรับแชแนลการแจ้งเตือนได้ด้วย Intent ที่ใช้การดำเนินการ ACTION_CHANNEL_NOTIFICATION_SETTINGS

ตัวอย่างเช่น โค้ดตัวอย่างต่อไปนี้แสดงวิธีเปลี่ยนเส้นทางผู้ใช้ไปยัง การตั้งค่าสำหรับช่องทางการแจ้งเตือน

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);

โปรดทราบว่า Intent ต้องมี 2 ส่วนเพิ่มเติมที่ระบุชื่อแพ็กเกจของแอป (หรือที่เรียกว่ารหัสแอปพลิเคชัน) และช่องที่จะแก้ไข

ลบช่องทางการแจ้งเตือน

คุณลบช่องทางการแจ้งเตือนได้โดยเรียกใช้ deleteNotificationChannel() โค้ดตัวอย่างต่อไปนี้แสดงวิธีทําขั้นตอนนี้ให้เสร็จสมบูรณ์

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);

สร้างกลุ่มช่องทางการแจ้งเตือน

หากต้องการจัดระเบียบลักษณะที่ปรากฏของแชแนลใน UI ของการตั้งค่าเพิ่มเติม คุณสามารถสร้างกลุ่มแชแนลได้ วิธีนี้เหมาะสำหรับกรณีที่แอปของคุณรองรับบัญชีผู้ใช้หลายบัญชี เช่น โปรไฟล์งาน เนื่องจากจะช่วยให้คุณสร้างกลุ่มแชแนลการแจ้งเตือนสำหรับแต่ละบัญชีได้ ด้วยวิธีนี้ ผู้ใช้จะระบุ และควบคุมช่องทางการแจ้งเตือนหลายช่องทางที่มีชื่อเหมือนกันได้อย่างง่ายดาย

รูปที่ 2 การตั้งค่าแชแนลการแจ้งเตือนที่มี กลุ่มสำหรับบัญชีส่วนตัวและบัญชีงาน

เช่น แอปโซเชียลเน็ตเวิร์กอาจรองรับบัญชีส่วนตัวและบัญชีงาน ในสถานการณ์นี้ บัญชีแต่ละบัญชีอาจต้องใช้ช่องทางการแจ้งเตือนหลายช่องที่มีฟังก์ชันและชื่อเหมือนกัน เช่น

  • บัญชีส่วนบุคคลที่มี 2 ช่อง

    • ความคิดเห็นใหม่

    • คำแนะนำโพสต์

  • บัญชีธุรกิจที่มี 2 ช่อง ได้แก่

    • ความคิดเห็นใหม่

    • คำแนะนำโพสต์

การจัดระเบียบช่องทางการแจ้งเตือนเป็นกลุ่มสำหรับแต่ละบัญชีช่วยให้ผู้ใช้แยกความแตกต่างระหว่างช่องทางการแจ้งเตือนได้

กลุ่มแชแนลการแจ้งเตือนแต่ละกลุ่มต้องมีรหัสที่ไม่ซ้ำกันภายในแพ็กเกจของคุณ รวมถึงชื่อที่ผู้ใช้มองเห็น ข้อมูลโค้ดต่อไปนี้แสดงวิธี สร้างกลุ่มแชแนลการแจ้งเตือน

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));

หลังจากสร้างกลุ่มใหม่แล้ว คุณสามารถเรียกใช้ setGroup() เพื่อเชื่อมโยงออบเจ็กต์ NotificationChannel ใหม่กับกลุ่ม

เมื่อส่งช่องไปยังเครื่องมือจัดการการแจ้งเตือนแล้ว คุณจะเปลี่ยน การเชื่อมโยงระหว่างช่องการแจ้งเตือนกับกลุ่มไม่ได้