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

ตั้งแต่ 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 โดยใช้ระดับความสำคัญ 1 ใน 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 การตั้งค่าเพิ่มเติม คุณสามารถสร้างกลุ่มแชแนลได้ วิธีนี้เหมาะสำหรับแอปที่รองรับบัญชีผู้ใช้หลายบัญชี เนื่องจากช่วยให้คุณสร้างกลุ่มแชแนลการแจ้งเตือนสำหรับแต่ละบัญชีได้ กลุ่มแชแนลช่วยให้ผู้ใช้แยกความแตกต่างและควบคุมแชแนลการแจ้งเตือนหลายรายการที่มีชื่อเหมือนกันได้

รูปที่ 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 ใหม่กับกลุ่มได้

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