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

เริ่มตั้งแต่ 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()

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the NotificationChannel.
    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 =
        context.getSystemService(NotificationManager::class.java)
    notificationManager?.createNotificationChannel(mChannel)
}

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

โดยค่าเริ่มต้น การแจ้งเตือนทั้งหมดที่โพสต์ในแชแนลที่กำหนดจะใช้ลักษณะการทำงานด้านภาพและเสียงที่กำหนดโดยระดับความสำคัญจากคลาส 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

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

val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
    putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, CHANNEL_ID)
}
Button(onClick = {
    context.startActivity(intent)
}) {
    Text("Open Channel Settings")
}

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

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

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

val notificationManager =
    ContextCompat.getSystemService<NotificationManager>(context, NotificationManager::class.java)
notificationManager?.deleteNotificationChannel(channelId)

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

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

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

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

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

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

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

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

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

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

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

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

fun createNotificationChannelGroup(context: Context, groupId: String, groupName: String) {
    val notificationManager =
        ContextCompat.getSystemService(context, NotificationManager::class.java)
    notificationManager?.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
}

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

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