Notification Channel (ช่องทางการแจ้งเตือน) — เป็นกลไกของ Android ที่เริ่มใช้ในเวอร์ชัน 8.0 (API 26) ซึ่งจัดกลุ่มการแจ้งเตือนตามหมวดหมู่และให้ผู้ใช้ควบคุมพฤติกรรมของมัน แต่ละช่องทางกำหนดระดับความสำคัญ เสียง การสั่น และรูปแบบภาพสำหรับการแจ้งเตือนทั้งหมดที่ส่งผ่านช่องทางนั้น ตามข้อมูลจาก Android Developers, NotificationChannel เป็นสิ่งที่จำเป็นสำหรับการแจ้งเตือนทั้งหมดบน Android 8+ — หากไม่มีช่องทาง การแจ้งเตือนจะไม่แสดง
สาระสำคัญ
Notification Channel — คอนเทนเนอร์เชิงตรรกะสำหรับการแจ้งเตือนประเภทเดียวกันใน Android 8+ (Oreo) นักพัฒนาสร้างช่องทางด้วย ID ที่ไม่ซ้ำกัน กำหนดพารามิเตอร์ของมัน จากนั้นส่งการแจ้งเตือนแต่ละครั้งโดยระบุช่องทางนี้ การแจ้งเตือนทั้งหมดในช่องทางเดียวกันจะสืบทอดการตั้งค่าของมัน
ก่อน Android 8 การจัดการการแจ้งเตือนเป็นแบบ binary: ทั้งหมดหรือไม่มีเลย ผู้ใช้สามารถปิดการแจ้งเตือนทั้งหมดของแอปเท่านั้น ช่องทางแก้ปัญหานี้: ตอนนี้สามารถปิดการแจ้งเตือน "โฆษณา" ได้ แต่ยังคงไว้ซึ่ง "ข้อความจากเพื่อน"
หลังจากสร้างช่องทางแล้ว ความสำคัญ (importance) สามารถเปลี่ยนแปลงโดยผู้ใช้ได้ทุกเมื่อผ่าน การตั้งค่า → แอป → การแจ้งเตือน นักพัฒนาไม่สามารถเปลี่ยน importance ผ่านโปรแกรมหลังจากสร้างช่องทางแล้ว — นี่คือข้อจำกัดด้านความปลอดภัยของ Android
บน Android 8+ การแจ้งเตือนทุกครั้งต้องส่งผ่าน NotificationChannel หากแอปพยายามแสดงการแจ้งเตือนโดยไม่มีช่องทาง — ระบบจะไม่สนใจอย่างเงียบๆ ข้อยกเว้น — การแจ้งเตือนผ่าน NotificationCompat พร้อมช่องทางเริ่มต้นที่สร้างโดยไลบรารีโดยอัตโนมัติ
ช่องทางการแจ้งเตือนถูกกำหนดโดยชุดพารามิเตอร์ที่ตั้งค่าเมื่อสร้างผ่านคลาส NotificationChannel พารามิเตอร์หลักคือระดับความสำคัญ (importance level) ซึ่งกำหนดวิธีการแจ้งเตือนโต้ตอบกับผู้ใช้
หลังจากสร้าง ช่องทางจะปรากฏในการตั้งค่าระบบของผู้ใช้ ผู้ใช้สามารถ เปลี่ยน importance ปิดเสียง การสั่น หรือปิดกั้นช่องทางทั้งหมด การเปลี่ยนแปลงทั้งหมดมีผลทันทีสำหรับการแจ้งเตือนที่ตามมาทั้งหมด
เมื่อสร้าง NotificationChannel สามารถกำหนดค่า: เสียง (แบบกำหนดเองหรือระบบ), การสั่น (รูปแบบและระยะเวลา), ไฟแสดงสถานะ (สี LED), ป้ายไอคอน (setShowBadge), การล็อกหน้าจอ (setLockscreenVisibility) และ โหมดห้ามรบกวน (setBypassDnd) พารามิเตอร์เหล่านี้จะถูกกำหนดเมื่อสร้างช่องทางและสามารถเปลี่ยนแปลงได้โดยผู้ใช้เท่านั้นในภายหลัง
ระดับความสำคัญ (importance) — พารามิเตอร์หลักของช่องทาง มันกำหนดว่าการแจ้งเตือนจะแสดงเสียง ปรากฏบนหน้าจอ หรือเพียงแค่อยู่ในร่ม ความสำคัญไม่ควรสับสนกับลำดับความสำคัญ — importance ถูกกำหนดโดยช่องทาง ในขณะที่ลำดับความสำคัญ (setPriority) จะถูกละเว้นบน Android 8+
| ระดับ | ค่าคงที่ | พฤติกรรม | เสียง |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | แสดง heads-up banner ปรากฏในแถบแจ้งเตือน | ใช่ |
| DEFAULT | IMPORTANCE_DEFAULT (3) | ปรากฏในแถบแจ้งเตือน ไม่มี heads-up | ใช่ |
| LOW | IMPORTANCE_LOW (2) | ปรากฏในแถบแจ้งเตือนโดยไม่มีเสียง | ไม่ |
| MIN | IMPORTANCE_MIN (1) | เฉพาะในร่ม ไม่มีเสียงและการสั่น | ไม่ |
| NONE | IMPORTANCE_NONE (0) | ไม่แสดงเลย | ไม่ |
สำหรับสถานการณ์ผู้ใช้ส่วนใหญ่ ใช้ IMPORTANCE_DEFAULT (3) — การแจ้งเตือนจะปรากฏในแถบแจ้งเตือนพร้อมเสียง แต่ไม่มีป้ายลอย IMPORTANCE_HIGH ใช้เฉพาะสำหรับเหตุการณ์ที่สำคัญ: สายเรียกเข้า ข้อความจากคู่สนทนา การเตือนด้วยตัวจับเวลา
ช่องทางจะถูกสร้างครั้งเดียวเมื่อเริ่มแอปหรือเมื่อใช้งานครั้งแรก แนวทางปฏิบัติที่ดีที่สุดคือสร้างช่องทางทั้งหมดเมื่อเริ่มแอป ในเมธอด Application.onCreate การสร้างช่องทางที่มีอยู่แล้วซ้ำนั้นปลอดภัย — Android จะละเว้นการเรียกหากช่องทางมีอยู่แล้ว
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"ข้อความ",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "การแจ้งเตือนข้อความใหม่"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"โปรโมชั่นและข่าวสาร",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "การแจ้งเตือนการตลาดและข้อเสนอพิเศษ"
setShowBadge(false)
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(messagesChannel)
manager.createNotificationChannel(promoChannel)
}
companion object {
const val CHANNEL_MESSAGES = "messages"
const val CHANNEL_PROMO = "promo"
}
}
เมื่อส่งการแจ้งเตือน ให้ระบุ ID ช่องทางผ่าน setChannelId (สำหรับ NotificationCompat) หรือในคอนสตรัคเตอร์ของ Notification.Builder หากช่องทางที่มี ID ที่ระบุไม่มีอยู่ — การแจ้งเตือนจะไม่แสดง แต่จะไม่มีข้อผิดพลาดเกิดขึ้น
Android มี API หลายตัวสำหรับการจัดการช่องทางผ่านโปรแกรม: การรับรายการ การลบ และการตรวจสอบการตั้งค่าปัจจุบัน การลบช่องทางส่งผลให้การแจ้งเตือนทั้งหมดในประวัติถูกลบโดยระบบ
val manager =
getSystemService(NotificationManager::class.java)
// รับรายการช่องทางทั้งหมด
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Channels", "${channel.id}: ${channel.importance}")
}
// ดู importance ปัจจุบัน (ผู้ใช้อาจเปลี่ยนแปลง)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// ผู้ใช้ปิดช่องทางแล้ว
suggestEnablingChannel()
}
// ลบช่องทาง
manager.deleteNotificationChannel(CHANNEL_PROMO)
หลังจากสร้างช่องทาง นักพัฒนา ไม่สามารถเปลี่ยน importance ผ่านโปรแกรมได้ — นี่คือข้อจำกัดของ Android เพื่อป้องกันผู้ใช้จากการถูกเอารัดเอาเปรียบ หากจำเป็นต้องเปลี่ยนความสำคัญของช่องทาง ให้สร้างช่องทางใหม่ด้วย ID อื่นและย้ายการแจ้งเตือน
หากจำเป็นต้องเปลี่ยนความสำคัญของช่องทางที่มีอยู่ ให้สร้างช่องทางใหม่ด้วย ID อื่น (เช่น "messages_v2") และเริ่มส่งการแจ้งเตือนไปยังช่องทางนั้น ช่องทางเก่าสามารถลบได้ผ่าน deleteNotificationChannel — การแจ้งเตือนทั้งหมดจะถูกลบออกจากประวัติ แจ้งให้ผู้ใช้ทราบเกี่ยวกับการย้ายผ่านอินเทอร์เฟซของแอปเพื่อไม่ให้สูญเสียการตั้งค่า
NotificationChannelGroup รวมหลายช่องทางเป็นกลุ่มภาพเดียวในอินเทอร์เฟซการตั้งค่าของ Android กลุ่มช่วยให้ผู้ใช้ปรับทิศทางได้เมื่อแอปใช้ 5+ ช่องทาง: เช่น "สังคม", "ระบบ", "การตลาด"
กลุ่มถูกสร้างผ่าน createNotificationChannelGroup และส่งให้ช่องทางเมื่อสร้างผ่านเมธอด setGroup การลบกลุ่มจะลบช่องทางทั้งหมดด้วย แต่ละช่องทางสามารถเป็นสมาชิกของกลุ่มเดียวเท่านั้น
ในทางปฏิบัติ กลุ่มช่องทาง แนะนำ สำหรับแอปที่มีมากกว่า 3 ช่องทาง กลุ่มทำให้การนำทางในการตั้งค่าง่ายขึ้นและลดโอกาสที่ผู้ใช้จะปิดการแจ้งเตือนทั้งหมดโดยไม่เข้าใจรายการช่องทาง
กลุ่มถูกสร้างผ่าน createNotificationChannelGroup ด้วย ID และชื่อที่ไม่ซ้ำกัน จากนั้นแต่ละช่องทางจะถูกผูกกับกลุ่มผ่านเมธอด setGroup ในการตั้งค่าระบบ กลุ่มจะแสดงเป็นส่วนที่มีหัวข้อ ซึ่งภายใต้มีช่องทางทั้งหมดของกลุ่มนี้ หากกลุ่มถูกลบ ช่องทางทั้งหมดจะถูกลบโดยอัตโนมัติโดยระบบโดยไม่สามารถกู้คืนได้
การออกแบบช่องทางการแจ้งเตือนที่เหมาะสมส่งผลโดยตรงต่อประสบการณ์ผู้ใช้และการรักษาผู้ใช้ รูปแบบหลัก — สามระดับความสำคัญ: ช่องทางสำคัญ (IMPORTANCE_HIGH) สำหรับข้อความและการโทร มาตรฐาน (IMPORTANCE_DEFAULT) สำหรับการแจ้งเตือนทั่วไป และเงียบ (IMPORTANCE_LOW) สำหรับการตลาดและข่าวสาร การไล่ระดับนี้ให้ผู้ใช้มีตัวเลือกที่เข้าใจได้โดยไม่ท่วมท้น
รูปแบบที่สอง — ช่องทางตามโมดูลฟังก์ชัน แต่ละโมดูลหลักของแอป (แชท คำสั่งซื้อ ฟีด การตลาด) มีช่องทางของตัวเอง หากมีมากกว่า 5 โมดูล ให้รวมเป็น NotificationChannelGroup ในการตั้งค่าระบบ กลุ่มจะแสดงเป็นส่วนที่ซ่อนได้ — ทำให้การนำทางง่ายขึ้น
รูปแบบที่สาม — ช่องทางสำหรับนักพัฒนา สร้างช่องทางแยกต่างหากด้วย IMPORTANCE_MIN สำหรับการแจ้งเตือนดีบักและบริการ ผู้ใช้จะไม่เห็นในแถบ แต่ผู้พัฒนาสามารถวิเคราะห์บันทึกผ่าน adb ใน Production สามารถลบหรือซ่อนช่องทางนี้จากอินเทอร์เฟซผ่าน Intent ในการตั้งค่า
รูปแบบที่สี่ — การตอบกลับเกี่ยวกับช่องทาง แสดงให้ผู้ใช้เห็นในอินเทอร์เฟซว่าช่องทางใดทำงานอยู่และ importance ปัจจุบันคืออะไร บน Android 8+ สามารถรับสถานะช่องทางผ่าน getNotificationChannel และแนะนำให้ผู้ใช้เปลี่ยนการตั้งค่าหากช่องทางถูกปิด นี่สำคัญเป็นพิเศษสำหรับฟังก์ชันที่สำคัญของแอป
คำถามที่พบบ่อย
การแจ้งเตือน จะไม่แสดง ทั้งในแถบและในร่ม ระบบจะไม่สนใจการเรียก notify() อย่างเงียบๆ ข้อยกเว้น: เมื่อใช้ NotificationCompat ไลบรารีจะสร้างช่องทางเริ่มต้น แต่ importance ของมันจะเป็น DEFAULT เสมอ แนะนำให้สร้างช่องทางของคุณเองเสมอ
สามารถเปลี่ยน ชื่อ คำอธิบาย และเสียงของช่องทางได้ ไม่สามารถเปลี่ยน importance ได้ — การตัดสินใจนี้ได้รับการป้องกันโดยระบบจากนักพัฒนา หากต้องการเพิ่มความสำคัญ — ให้สร้างช่องทางใหม่ด้วย ID อื่นและใช้สำหรับการแจ้งเตือนใหม่ ผู้ใช้สามารถเปลี่ยน importance ได้ทุกเมื่อ
ใช้ getNotificationChannel และตรวจสอบ importance: หากค่าเท่ากับ IMPORTANCE_NONE แสดงว่าช่องทางถูกปิดแล้ว นอกจากนี้ยังสามารถเปิดการตั้งค่าระบบของช่องทางผ่าน Intent: Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS พร้อมพารามิเตอร์ app_package และ channel_id
ไม่มีข้อจำกัด — Android ไม่กำหนดขีดจำกัดจำนวนช่องทาง อย่างไรก็ตาม แนะนำไม่ให้สร้างมากกว่า 5–10 ช่องทางเพื่อไม่ให้ผู้ใช้เลือกมากเกินไป ขั้นต่ำที่เหมาะสมคือ 2–3 ช่องทาง: การแจ้งเตือนสำคัญ ปกติ และการตลาด
บน Android 7.1 (API 25) และต่ำกว่า ไม่รองรับช่องทาง คลาส NotificationChannel มีเฉพาะตั้งแต่ API 26 เป็นต้นไป สำหรับความเข้ากันได้ย้อนหลัง ใช้ NotificationCompat และครอบการสร้างช่องทางในเงื่อนไข if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม