การใช้การแจ้งเตือนของ Android

Codelab นี้เป็นส่วนหนึ่งของหลักสูตร Android ขั้นสูงใน Kotlin คุณจะได้รับประโยชน์สูงสุดจากหลักสูตรนี้ หากเรียนผ่าน Codelab ตามลําดับ แต่ไม่บังคับ Codelab ของหลักสูตรทั้งหมดจะแสดงอยู่ในหน้า Landing Page ขั้นสูงของ Android ใน Kotlin Codelab

บทนำ

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

การแจ้งเตือนทั่วไปประกอบด้วยชื่อ คําอธิบาย และไอคอน การแจ้งเตือนอาจมีการทํางานที่คลิกได้ การตอบกลับด่วน เนื้อหาแบบขยายได้ และรูปภาพได้

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

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

ใน Codelab นี้ คุณจะได้ศึกษาวิธีสร้างและใช้การแจ้งเตือนในแอป Android

สิ่งที่ควรทราบอยู่แล้ว

คุณควรทําความคุ้นเคยกับสิ่งต่อไปนี้

  • วิธีดูแลจัดการแอป Android ใน Kotlin โดยเฉพาะอย่างยิ่งให้ทํางานร่วมกับ Android SDK
  • วิธีออกแบบแอปโดยใช้คอมโพเนนต์สถาปัตยกรรมและการเชื่อมโยงข้อมูล
  • ความเข้าใจเบื้องต้นเกี่ยวกับ BroadcastReceivers
  • ความเข้าใจพื้นฐานของ Alarm Manager

สิ่งที่คุณจะได้เรียนรู้

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

สิ่งที่คุณจะทํา

  • เพิ่มการแจ้งเตือนลงในแอปเริ่มต้น
  • ยกเลิกการแจ้งเตือนที่คุณส่งก่อนหน้านี้
  • สร้างช่องสําหรับการแจ้งเตือนประเภทต่างๆ
  • ปรับแต่งการแจ้งเตือนในแอปเริ่มต้น
  • เพิ่มการดําเนินการด่วนเพื่อให้การแจ้งเตือนเป็นแบบอินเทอร์แอกทีฟ
  • ปิดป้ายการแจ้งเตือน

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

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

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

หากต้องการดาวน์โหลดแอปตัวอย่าง ให้ทําอย่างใดอย่างหนึ่งต่อไปนี้

โคลนที่เก็บจาก GitHub และเปลี่ยนไปใช้สาขาเริ่มต้น

$  git clone https://github.com/googlecodelabs/android-kotlin-notifications


คุณอาจดาวน์โหลดที่เก็บเป็นไฟล์ ZIP แล้วแตกไฟล์ และเปิดใน Android Studio ได้ด้วย

ดาวน์โหลด Zip

  1. เปิดและเรียกใช้แอปใน Android Studio

คุณจะเห็นรูปไข่และเมนูแบบเลื่อนลงที่มีรายการช่วงเวลาที่กําหนดไว้ล่วงหน้าสําหรับทําอาหารไข่ คลิกรูปสามเหลี่ยมสําหรับเมนูแบบเลื่อนลงต้ม Soft ตัวเลือกแรกในรายการมีไว้เพื่อวัตถุประสงค์ในการทดสอบ และตั้งการปลุกเป็น 10 วินาทีเท่านั้น ข้างรายการนี้เป็นสวิตช์ที่เริ่มจับเวลาไข่ คุณใช้สวิตช์นี้เพื่อเริ่มและหยุดตัวจับเวลาของไข่ได้ทุกเมื่อที่ต้องการ โค้ดเริ่มต้นทํางานอย่างสมบูรณ์ ซึ่งหมายความว่าคุณจะตั้งตัวจับเวลารูปไข่และนับเวลาถอยหลังเป็น 0 ได้ เมื่อตัวจับเวลาเสร็จสิ้นแล้ว ข้อความโทสต์จะปรากฏขึ้นดังที่แสดงด้านล่าง

  1. ตรวจสอบซอร์สโค้ด แอปเริ่มต้นประกอบด้วยกิจกรรมเดียวที่ชื่อ MainActivity มีแพ็กเกจย่อยอยู่ 3 รายการ ได้แก่ receiver, ui และ util

  • /receiver - แพ็กเกจ receiver มีผู้รับการประกาศ 2 รายชื่อ AlarmReceiver และ SnoozeReceiver AlarmManager จะเรียกใช้ AlarmReceiver เพื่อส่งการแจ้งเตือนเมื่อตัวจับเวลาที่ผู้ใช้กําหนดหมดเวลา SnoozeReceiver จะจัดการการคลิกของผู้ใช้เพื่อเลื่อนการแจ้งเตือน
  • /ui - ประกอบด้วย EggTimerFragment ซึ่งเป็นส่วนหนึ่งของส่วน UI ของแอป EggTimerViewModel มีหน้าที่เริ่มต้นและยกเลิกตัวจับเวลา และสําหรับงานอื่นๆ ของแอปที่เกี่ยวข้องกับวงจรชีวิต
  • /util - ในแพ็กเกจนี้มี 2 ไฟล์ BindingUtils.kt มีอะแดปเตอร์การเชื่อมโยงเพื่อเปิดใช้การเชื่อมโยงข้อมูลระหว่าง UI ของแอปและ ViewModel NotificationUtils.kt มีเมธอดส่วนขยายใน NotificationManager

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

ขั้นตอนที่ 1: สร้างการแจ้งเตือนพื้นฐาน

ในงานนี้ คุณกําลังสร้างการแจ้งเตือนใหม่ ตั้งค่าข้อความสําหรับผู้ใช้ และส่งการแจ้งเตือน

  1. เปิดชั้นเรียน NotificationUtils.kt แล้วค้นหา TODO: Step 1.1 คุณจะพบสิ่งที่ต้องทําใน Codelab นี้และรหัสแอป
  2. ตรวจสอบฟังก์ชัน sendNotification() ที่ระบุ คุณกําลังขยายฟังก์ชันของส่วนขยายนี้ไปยัง NotificationManager เพื่อส่งการแจ้งเตือน
//NotificationUtils.kt
// TODO: Step 1.1 extension function to send messages (GIVEN)
/**
 * Builds and delivers a notification.
 *
 * @param messageBody, notification text.
 * @param context, activity context.
 */
fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context) {
  1. รับอินสแตนซ์ของเครื่องมือสร้างการแจ้งเตือน จากนั้นส่งในบริบทของแอปและรหัสช่อง รหัสช่องเป็นค่าสตริงสําหรับช่อง

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

//NotificationUtils.kt
// TODO: Step 1.2 get an instance of NotificationCompat.Builder
val builder = NotificationCompat.Builder(
        applicationContext,
        applicationContext.getString(R.string.egg_notification_channel_id)
)
  1. ตั้งค่าไอคอนการแจ้งเตือนให้แสดงถึงแอป ชื่อ และข้อความเนื้อหาสําหรับข้อความที่ต้องการมอบให้กับผู้ใช้ คุณจะเห็นตัวเลือกเพิ่มเติมเพื่อปรับแต่งการแจ้งเตือนใน Codelab เพิ่มเติม แต่นี่เป็นปริมาณข้อมูลขั้นต่ําที่คุณต้องตั้งค่าเพื่อส่งการแจ้งเตือน
//NotificationUtils.kt
   // TODO: Step 1.3 set title, text and icon to builder
   .setSmallIcon(R.drawable.cooked_egg)
   .setContentTitle(applicationContext.getString(R.string.notification_title))
   .setContentText(messageBody)
  1. จากนั้นคุณต้องเรียกใช้ notify() ด้วยรหัสที่ไม่ซ้ํากันของการแจ้งเตือน และด้วยออบเจ็กต์ Notification จากเครื่องมือสร้าง

รหัสนี้จะแสดงอินสแตนซ์การแจ้งเตือนปัจจุบัน และจําเป็นสําหรับการอัปเดตหรือยกเลิกการแจ้งเตือนนี้ เนื่องจากแอปของคุณจะมีการแจ้งเตือนที่ใช้งานอยู่เพียงครั้งละ 1 รายการเท่านั้น คุณจึงใช้รหัสเดียวกันสําหรับการแจ้งเตือนทั้งหมดได้ คุณคงที่สําหรับวัตถุประสงค์นี้ที่ชื่อ NOTIFICATION_ID ใน NotificationUtils.kt แล้ว สังเกตเห็นว่าคุณสามารถโทรหา notify() ได้โดยตรง เนื่องจากคุณโทรจากฟังก์ชันส่วนขยายในชั้นเรียนเดียวกัน

//NotificationUtils.kt
   // TODO: Step 1.4 call notify to send the notification
    // Deliver the notification
    notify(NOTIFICATION_ID, builder.build())
  1. เปิด ui/EggTimerViewModel.kt แล้วหาฟังก์ชัน startTimer() โดยฟังก์ชันนี้จะสร้างการปลุกด้วยช่วงเวลาที่เลือกเมื่อผู้ใช้เปิดใช้ตัวจับเวลารูปไข่
  2. คุณจะต้องทริกเกอร์การแจ้งเตือนในฟังก์ชันนี้เมื่อผู้ใช้เริ่มต้นตัวจับเวลา หากต้องการเรียกใช้ฟังก์ชัน sendNotification() ที่ใช้งานก่อนหน้านี้ คุณต้องใช้อินสแตนซ์ NotificationManager NotificationManager คือบริการระบบที่มีฟังก์ชันทั้งหมดซึ่งเปิดเผยสําหรับ API การแจ้งเตือน รวมถึงฟังก์ชันส่วนขยายที่คุณเพิ่ม เมื่อใดก็ตามที่ต้องการส่ง ยกเลิก หรืออัปเดตการแจ้งเตือน คุณต้องขออินสแตนซ์ NotificationManager จากระบบ เรียกใช้ฟังก์ชัน sendNotification()| ด้วยข้อความแจ้งเตือนและบริบท
// EggTimerViewModel.kt
// TODO: Step 1.5 get an instance of NotificationManager 
// and call sendNotification

val notificationManager = ContextCompat.getSystemService(
    app, 
    NotificationManager::class.java
) as NotificationManager
                notificationManager.sendNotification(app.getString(R.string.timer_running), app)

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

  1. เปิด logcat แล้วค้นหา "No Channel found" คุณควรจะเห็นข้อความแสดงข้อผิดพลาดว่าไม่มี egg_channel ในขั้นตอนต่อไป คุณจะได้ดูข้อมูลเพิ่มเติมเกี่ยวกับช่องการแจ้งเตือนและแก้ไขปัญหานี้

ขั้นตอนที่ 2: ช่องทางการแจ้งเตือน

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

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

นักพัฒนาซอฟต์แวร์ได้ตั้งค่าเริ่มต้น ความสําคัญ และลักษณะการทํางานที่จะใช้กับการแจ้งเตือนทั้งหมดในช่อง หลังจากกําหนดการตั้งค่าเริ่มต้นแล้ว ผู้ใช้จะลบล้างการตั้งค่าเหล่านี้ได้

ในขั้นตอนที่ 1.1 คุณใช้ egg_notification_channel_id เป็นช่องทางการแจ้งเตือน ดังนั้นตอนนี้คุณจะต้องสร้างและปรับแต่งการตั้งค่าและลักษณะการทํางานของการแจ้งเตือนของช่องนี้

  1. เปิด EggTimerFragment.kt แล้วหาฟังก์ชัน createChannel()
  2. ส่งรหัสช่องที่ไม่ซ้ํากันไปยังเครื่องมือสร้าง NotificationChannel
  3. ส่งชื่อช่องการแจ้งเตือน ซึ่งผู้ใช้จะเห็นในหน้าจอการตั้งค่าด้วย
  4. โปรดส่งพารามิเตอร์ระดับความสําคัญสําหรับช่องการแจ้งเตือนเป็นพารามิเตอร์สุดท้าย เราจะกล่าวถึงระดับความสําคัญในภายหลังใน Codelab ดังกล่าว ดังนั้นตอนนี้คุณสามารถใช้ NotificationManager.IMPORTANCE_LOW ได้
  5. ในออบเจ็กต์ notificationChannel ตั้งค่า enableLights เป็น true การตั้งค่านี้จะเปิดใช้หลอดไฟเมื่อแสดงการแจ้งเตือน
  6. ในออบเจ็กต์ notificationChannel ให้ตั้งค่า lightColor เป็นสีแดงเพื่อแสดงไฟสีแดงเมื่อแสดงการแจ้งเตือน
  7. ในออบเจ็กต์ notificationChannel ให้ตั้งค่า enableVibration เป็น true เพื่อเปิดใช้การสั่น
  8. ในคําอธิบายออบเจ็กต์ notificationChannel ให้ตั้งค่าเป็น ‘Time for breakfast&#39
  9. รับอินสแตนซ์ของ NotificationManager โดยโทรไปที่ getSystemService()
  10. เรียกใช้ createNotificationChannel() บน NotificationManager และส่งผ่านออบเจ็กต์ notificationChannel ที่คุณสร้างไว้ในขั้นตอนที่แล้ว
//EggTimerFragment.kt
private fun createChannel(channelId: String, channelName: String) {
    // TODO: Step 1.6 START create a channel
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val notificationChannel = NotificationChannel(
            channelId,
            channelName,
            // TODO: Step 2.4 change importance
            NotificationManager.IMPORTANCE_LOW
        )
        // TODO: Step 2.6 disable badges for this channel

        notificationChannel.enableLights(true)
        notificationChannel.lightColor = Color.RED
        notificationChannel.enableVibration(true)
        notificationChannel.description = "Time for breakfast"

        val notificationManager = requireActivity().getSystemService(
            NotificationManager::class.java
        )
        notificationManager.createNotificationChannel(notificationChannel)
    }
    // TODO: Step 1.6 END create channel
}
  1. ถัดไป หากต้องการสร้างช่อง คุณต้องเรียกใช้ฟังก์ชัน createChannel() ที่เพิ่งเขียน (ขั้นตอนที่ 1.7) ฟังก์ชันนี้จะรับพารามิเตอร์ 2 รายการ ได้แก่ รหัสช่องและชื่อช่อง คุณต้องค้นหารหัสช่องและชื่อช่องจากทรัพยากรสตริงที่มีอยู่ในโปรเจ็กต์แล้ว
// EggTimerFragment.kt
    // TODO: Step 1.7 call createChannel
    createChannel(
          getString(R.string.egg_notification_channel_id),
          getString(R.string.egg_notification_channel_name)
    )
  1. คุณต้องส่งรหัสช่องไปยังเครื่องมือสร้างการแจ้งเตือน คุณดําเนินการในขั้นตอนที่ 1.2 แล้ว การตั้งค่าที่ไม่ถูกต้องเป็นรหัสช่องจะทําให้การแจ้งเตือนล้มเหลวได้ เปิด NotificationUtils.kt เพื่อยืนยันว่ารหัสช่องที่ตั้งค่าไว้ก่อนหน้านี้ถูกต้อง
// NotificationUtils.kt
val builder = NotificationCompat.Builder(
        applicationContext,
       // TODO: Step 1.8 verify the notification channel name
        applicationContext.getString(R.string.egg_notification_channel_id)
)
  1. เรียกใช้แอป และคุณจะเห็นแอปส่งการแจ้งเตือนทุกครั้งที่คุณเริ่มตัวจับเวลา
  2. ดึงแถบสถานะและสังเกตว่าชื่อ เนื้อหา และไอคอนการแจ้งเตือนเป็นไปตามที่คุณกําหนดไว้ในขั้นตอนก่อนหน้า
  3. ในการยืนยันช่องที่สร้างใหม่ ให้ปิดแอป แล้วหาไอคอนแอปนั้น แตะไอคอนแอปค้างไว้ แล้วเลือกข้อมูลแอป

  1. เลือกการแจ้งเตือนจากรายการการตั้งค่า คุณควรเห็นช่องใหม่ที่ชื่อ Egg อยู่ใต้การตั้งค่าแสดงการแจ้งเตือน

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

ขั้นตอนที่ 3: เพิ่มการแจ้งเตือนในแอป

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

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

แอปใช้ AlarmManager เพื่อตั้งปลุก รหัสที่เกี่ยวข้องกับ AlarmManager จะมีอยู่ในโค้ดเริ่มต้นอยู่แล้วและใช้เพื่อแสดงข้อความโทสต์ AlarmManager ติดตามการเลือกเวลาที่ต้องการและจะเรียกใช้ฟังก์ชัน onReceive() ของ AlarmReceiver.kt เมื่อหมดเวลา หากคุณเปิด AlarmReceiver.kt และไปยัง onReceive() คุณควรจะเห็นข้อความโทสต์ปรากฏขึ้นทุกครั้งที่ตั้งค่าตัวจับเวลารูปไข่

  1. เปิด AlarmReceiver.kt อินสแตนซ์ของ NotificationManager และเรียกใช้ฟังก์ชัน sendNotification() ด้วยข้อความและพารามิเตอร์บริบท
// AlarmReceiver.kt
   // TODO: Step 1.9 add call to sendNotification
   val notificationManager = ContextCompat.getSystemService(
       context, 
       NotificationManager::class.java
   ) as NotificationManager
             
   notificationManager.sendNotification(
       context.getText(R.string.eggs_ready).toString(), 
       context
   )
  1. (ไม่บังคับ) นําข้อความโทสต์ออกเพราะแอปจะส่งการแจ้งเตือนเมื่อหมดเวลา
// AlarmReceiver.kt
     // TODO: Step 1.10 [Optional] remove toast
//   Toast.makeText(
//       context, 
//       context.getText(R.string.eggs_ready),
//       Toast.LENGTH_SHORT
//   ).show()
  1. เรียกใช้แอป คุณควรเห็นการแจ้งเตือนทุกครั้งที่เริ่มตัวจับเวลาและทุกครั้งที่หมดเวลา

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

  1. เปิด EggTimerFragment.kt และนํารหัสการแจ้งเตือนสําหรับขั้นตอนที่ 1.5 ออก
// EggTimeViewModel.kt

// TODO: Step 1.5 get an instance of NotificationManager 
// and call sendNotification
// val notificationManager = ContextCompat.getSystemService(
//      app,
//      NotificationManager::class.java
// ) as NotificationManager
// notificationManager.sendNotification(app.getString(R.string.eggs_ready), app)
  1. เรียกใช้แอปอีกครั้ง
  2. ตั้งตัวจับเวลา วางอยู่เบื้องหลัง และรอเวลาให้เสร็จเรียบร้อย คุณจะเห็นการแจ้งเตือน การแจ้งเตือนนี้มีประโยชน์มากกว่า

ขั้นตอนที่ 4: เพิ่มความตั้งใจด้านเนื้อหา

  1. เรียกใช้แอปอีกครั้งหากไม่ได้เรียกใช้อยู่แล้ว
  2. คลิกการแจ้งเตือนนั้น ไม่มีอะไรเกิดขึ้น

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

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

  1. เปิด NotificationUtils.kt แล้วหาฟังก์ชันส่วนขยาย sendNotification()
  2. สร้าง Intent ที่มี applicationContext และกิจกรรมที่จะเปิดใช้ MainActivity::class.java
// NotificationUtils.kt

fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context) {
    // Create the content intent for the notification, which launches
    // this activity
   // TODO: Step 1.11 create intent
    val contentIntent = Intent(applicationContext, MainActivity::class.java)

คุณสร้างความตั้งใจแล้ว แต่การแจ้งเตือนจะแสดงอยู่นอกแอป คุณจะต้องสร้าง PendingIntent ใหม่เพื่อให้ Intent ทํางานนอกแอป

PendingIntent ให้สิทธิ์ในแอปพลิเคชันอื่นหรือระบบเพื่อดําเนินการในนามของแอปพลิเคชันของคุณ PendingIntent เองคือการอ้างอิงไปยังโทเค็นที่เก็บรักษาไว้โดยระบบที่อธิบายข้อมูลเดิมที่ใช้เรียกข้อมูล ซึ่งหมายความว่าแม้ว่ากระบวนการของแอปดังกล่าวจะสังหาร แต่ PendingIntent เองจะยังคงใช้งานได้จากกระบวนการอื่นๆ ที่มี ในกรณีนี้ ระบบจะใช้ Intent ที่รอดําเนินการเพื่อเปิดแอปแทนคุณ ไม่ว่าแอปตัวจับเวลาจะทํางานหรือไม่ก็ตาม

  1. สร้าง PendingIntent ที่มี applicationContext, NOTIFICATION_ID, contentIntent ที่คุณสร้างในขั้นตอนก่อนหน้า และแฟล็ก PendingIntent แฟล็ก PendingIntent จะระบุตัวเลือกเพื่อสร้าง PendingIntent ใหม่หรือใช้รายการที่มีอยู่ คุณต้องตั้งค่า PendingIntent.FLAG_UPDATE_CURRENT เป็นธง เนื่องจากไม่ต้องการสร้างการแจ้งเตือนใหม่หากมีการแจ้งเตือนที่มีอยู่ วิธีนี้จะช่วยให้คุณแก้ไข PendingIntent ปัจจุบันซึ่งเชื่อมโยงกับความตั้งใจที่คุณระบุ
// NotificationUtils.kt
   // TODO: Step 1.12 create PendingIntent
    val contentPendingIntent = PendingIntent.getActivity(
        applicationContext, 
        NOTIFICATION_ID,
        contentIntent,
        PendingIntent.FLAG_UPDATE_CURRENT
    )
  1. ส่ง PendingIntent ไปยังการแจ้งเตือนของคุณ โดยโทรหา setContentIntent() ใน NotificationBuilder ตอนนี้ เมื่อคุณคลิกการแจ้งเตือน ระบบจะเรียกให้ PendingIntent แสดงหน้า MainActivity ขึ้นมา
  2. และตั้งค่าให้ setAutoCancel() เป็น true ด้วย เมื่อใดก็ตามที่ผู้ใช้แตะการแจ้งเตือน การแจ้งเตือนจะปิดเองเมื่อนําผู้ใช้ไปยังแอป
// NotificationUtils.kt
    // TODO: Step 1.13 set content intent
    .setContentIntent(contentPendingIntent)
    .setAutoCancel(true)
  1. เรียกใช้แอปอีกครั้ง
  2. ตั้งตัวจับเวลา วางแอปในพื้นหลัง และรอให้การแจ้งเตือนปรากฏขึ้น
  3. เมื่อเห็นการแจ้งเตือน ให้คลิกการแจ้งเตือนโดยดึงแถบสถานะลง แล้วสังเกตดูว่าแอปได้รับเบื้องหน้าอย่างไร

ขั้นตอนที่ 5: ยกเลิกการแจ้งเตือน

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

หากต้องการแก้ไขปัญหานี้ คุณต้องล้างการแจ้งเตือนก่อนหน้าเมื่อเริ่มตัวจับเวลาใหม่ เริ่มต้นด้วยการสร้างฟังก์ชันส่วนขยายอื่นใน NotificationUtils.kt NotificationManager มี API เพื่อยกเลิกการแจ้งเตือนที่ใช้งานอยู่ทั้งหมดชื่อ cancelAll()

  1. เปิด NotificationsUtil.kt
  2. เพิ่มฟังก์ชันส่วนขยายใน NotificationManager ซึ่งเรียกใช้ cancelAll()
// NotificationUtils.kt

// TODO: Step 1.14 Cancel all notifications
/**
 * Cancels all notifications.
 *
 */
fun NotificationManager.cancelNotifications() {
    cancelAll()
}
  1. เปิด EggTimerViewModel.kt แล้วไปที่ฟังก์ชัน startTimer()
  2. ใน startTimer() รับอินสแตนซ์ของ NotificationManager จากระบบและเรียก cancelNotifications()
//  EggTimerViewModel.kt
   //TODO Step 1.15 call cancel notification
    val notificationManager =
       ContextCompat.getSystemService(
            app,
            NotificationManager::class.java
        ) as NotificationManager
    notificationManager.cancelNotifications()       
  1. เรียกใช้แอปและเริ่มตัวจับเวลา
  2. หลังจากเห็นการแจ้งเตือน ให้เริ่มตัวจับเวลาอีกครั้งและสังเกตวิธีที่แอปลบการแจ้งเตือนก่อนหน้าออกจากแถบสถานะโดยอัตโนมัติ

เฟรมเวิร์กการแจ้งเตือนจะมีตัวเลือกการปรับแต่งที่หลากหลายให้นักพัฒนาแอปกําหนดการดําเนินการแบบกําหนดเองและจัดรูปแบบการแจ้งเตือนตามต้องการ ขณะทํางานนี้จะอธิบายวิธีปรับแต่งการแจ้งเตือนตัวจับเวลาของไข่

ขั้นตอนที่ 1: จัดรูปแบบการแจ้งเตือน

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

NotificationCompat นําเสนอฟีเจอร์ในตัวสําหรับ

  • BigTextStyle ซึ่งแสดงกลุ่มข้อความขนาดใหญ่ได้ เช่น การแสดงเนื้อหาอีเมลเมื่อขยาย
  • BigPictureStyle ซึ่งแสดงการแจ้งเตือนรูปแบบขนาดใหญ่ที่มีไฟล์แนบรูปภาพขนาดใหญ่
  • InboxStyle ซึ่งแสดงเนื้อหารูปแบบการสนทนา
  • MediaStyle ซึ่งแสดงตัวควบคุมสําหรับการเล่นสื่อ
  • MessagingStyle ซึ่งแสดงการแจ้งเตือนรูปแบบขนาดใหญ่ที่มีหลายข้อความระหว่างจํานวนคน

คุณดูข้อมูลเพิ่มเติมเกี่ยวกับสไตล์อื่นๆ ได้ในเอกสารประกอบสําหรับสร้างการแจ้งเตือนที่ขยายได้ ในขั้นตอนนี้ คุณจะใช้ NotificationCompat.BigPictureStyle เพื่อสร้างการแจ้งเตือนที่ขยายได้ซึ่งแสดงรูปภาพไข่ขนาดใหญ่เมื่อขยาย

  1. เปิด NotificationUtils.kt แล้วหาฟังก์ชัน sendNotification()
  2. เริ่มต้นด้วยการโหลดรูปภาพจาก resources โดยใช้ BitmapFactory
// NotificationUtils.kt

// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
     applicationContext.resources, 
     R.drawable.cooked_egg
)
  1. สร้าง BigPictureStyle ใหม่และตั้งค่ารูปภาพของคุณ
  2. ตั้งค่า bigLargeIcon() เป็น null เพื่อให้ไอคอนขนาดใหญ่หายไปเมื่อมีการขยายการแจ้งเตือน
// NotificationUtils.kt

// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
     applicationContext.resources, 
     R.drawable.cooked_egg
)
val bigPicStyle = NotificationCompat.BigPictureStyle()
        .bigPicture(eggImage)
        .bigLargeIcon(null)
  1. ตั้งค่ารูปแบบด้วย setStyle() เป็น bigPicStyle
  2. ตั้งค่าไอคอนขนาดใหญ่ด้วย setLargeIcon() เป็น eggImage รูปภาพจะแสดงเป็นไอคอนขนาดเล็กเมื่อยุบการแจ้งเตือน
// NotificationUtils.kt
// TODO: Step 2.1 add style to builder
.setStyle(bigPicStyle)
.setLargeIcon(eggImage)
  1. เรียกใช้แอปและตั้งตัวจับเวลา เมื่อมีการแสดงการแจ้งเตือนเป็นครั้งแรก การแจ้งเตือนนั้นจะอยู่ในสถานะยุบในลิ้นชักการแจ้งเตือน หากคุณขยายการแจ้งเตือน รูปภาพขนาดใหญ่จะแสดงในพื้นที่การแจ้งเตือนแบบขยาย

ขั้นตอนที่ 2: การดําเนินการแจ้งเตือน

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

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

หากต้องการเพิ่มปุ่มการทํางาน ให้ส่ง PendingIntent ไปยังฟังก์ชัน addAction() ในเครื่องมือสร้าง ซึ่งคล้ายกับการตั้งค่าการทํางานด้วยการแตะเริ่มต้นของการแจ้งเตือนโดยเรียก setContentIntent() ยกเว้นการดําเนินการอื่นๆ เช่น เริ่มต้น BroadcastReceiver ที่ทํางานในเบื้องหลังเพื่อให้การดําเนินการไม่รบกวนแอปที่เปิดอยู่แล้ว ยกเว้นการเปิดใช้กิจกรรม

ใน Codelab นี้ คุณได้รับ BoadcastReceiver ชื่อ SnoozeReceiver อยู่แล้ว คุณจะใช้ SnoozeReceiver เพื่อรับการคลิกของผู้ใช้บนการแจ้งเตือน ในขั้นตอนต่อไป คุณจะต้องเพิ่มโค้ดเพื่อเลื่อนการแจ้งเตือนตัวจับเวลาของไข่เป็นเวลา 60 วินาทีเมื่อผู้ใช้คลิกปุ่มเลื่อนการปลุก เมื่อคลิกการดําเนินการเลื่อนการปลุก SnoozeReceiver จะได้รับความตั้งใจและจะสร้างการปลุกใหม่เพื่อส่งการแจ้งเตือนใหม่หลังผ่านไป 60 วินาที

  1. เปิด SnoozeReceiver.kt ชั้นเรียนนี้คล้ายกับ AlarmReceiver ที่คุณเคยใช้ก่อนหน้านี้ ในขั้นตอนต่อไป คุณจะต้องเพิ่มโค้ดซึ่งจะทําให้ฟังก์ชัน onReceive() ของ SnoozeReceiver ทํางาน สรุปคือ รหัสในSnoozeReceiverจะสร้างการปลุกใหม่เพื่อส่งการแจ้งเตือนใหม่หลังผ่านไป 1 นาที เลื่อนลงไปที่ด้านล่างของฟังก์ชัน onReceive แล้วรับอินสแตนซ์ Alert Manager จากระบบและเรียกการยกเลิกทั้งหมด
// SnoozeReceiver.kt
        val notificationManager = ContextCompat.getSystemService(
            context,
            NotificationManager::class.java
        ) as NotificationManager
        notificationManager.cancelAll()
  1. หากต้องการใช้ SnoozeReceiver ให้เปิด NotificationUtils.kt
  2. สร้าง Intent snoozeIntent ใหม่สําหรับ SnoozeReceiver หลังรูปแบบในฟังก์ชัน sendNotification()
  3. สร้าง Intent ที่รอดําเนินการโดยเรียกเมธอด getBroadcast() ใน PendingIntent ซึ่งคาดว่าจะพบพารามิเตอร์ในขั้นตอนต่อไปนี้ ระบบจะใช้ PendingIntent นี้ในการตั้งปลุกใหม่เพื่อโพสต์การแจ้งเตือนใหม่หลังจากผ่านไป 60 วินาทีเมื่อผู้ใช้แตะปุ่มเลื่อนการปลุก
  4. พารามิเตอร์แรกคือบริบทแอปพลิเคชันที่ PendingIntent นี้ควรเริ่มกิจกรรม
  5. พารามิเตอร์ที่ 2 คือโค้ดคําขอ ซึ่งเป็นโค้ดคําขอสําหรับ Intent ที่รอดําเนินการนี้ หากต้องการอัปเดตหรือยกเลิกความตั้งใจที่รอดําเนินการนี้ คุณต้องใช้รหัสนี้เพื่อเข้าถึงความตั้งใจที่รอดําเนินการ
  6. จากนั้นให้เพิ่มออบเจ็กต์ snoozeIntent ซึ่งเป็นวัตถุประสงค์ของกิจกรรมที่จะเปิดตัว
  7. ขั้นตอนสุดท้าย ให้เพิ่มค่าธง #FLAG_ONE_SHOT เนื่องจากจะใช้ความตั้งใจเพียงครั้งเดียวเท่านั้น การดําเนินการด่วนและการแจ้งเตือนจะหายไปหลังจากการแตะครั้งแรกซึ่งเป็นเหตุผลที่มีการใช้ Intent ได้ครั้งเดียวเท่านั้น
// NotificationUtils.kt

// TODO: Step 2.2 add snooze action
val snoozeIntent = Intent(applicationContext, SnoozeReceiver::class.java)
val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(
    applicationContext, 
    REQUEST_CODE, 
    snoozeIntent, 
    FLAGS
)
  1. จากนั้นเรียกใช้ฟังก์ชัน addAction() ใน notificationBuilder ฟังก์ชันการทํางานนี้จะมีไอคอนและข้อความที่อธิบายการดําเนินการของคุณให้ผู้ใช้ทราบ นอกจากนี้คุณยังต้องเพิ่ม snoozeIntent ระบบจะใช้ Intent นี้ทริกเกอร์ boadcastReceiver ที่ถูกต้องเมื่อคลิกการดําเนินการของคุณ
// NotificationUtils.kt
// TODO: Step 2.3 add snooze action
.addAction(
    R.drawable.egg_icon, 
    applicationContext.getString(R.string.snooze),
    snoozePendingIntent
)
  1. เรียกใช้แอปตัวจับเวลาไข่เพื่อทดสอบการดําเนินการเลื่อนการปลุก
  2. เรียกใช้ตัวจับเวลาและวางแอปในพื้นหลัง เมื่อตัวจับเวลาดังขึ้น ให้ขยายการแจ้งเตือนและคุณจะเห็นว่าการแจ้งเตือนมีปุ่มเลื่อนการปลุกที่เลื่อนการปลุกอีก 1 นาที

ขั้นตอนที่ 3: ความสําคัญของการแจ้งเตือน

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

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

ระดับความสําคัญของช่อง

ระดับความสําคัญที่ผู้ใช้เห็น

ความสําคัญ (Android 8.0 ขึ้นไป)

ลําดับความสําคัญ (Android 7.1 และต่ํากว่า)

ส่งเสียงและปรากฏเป็นการแจ้งเตือนล่วงหน้า (ป๊อปอัปที่ด้านบนของหน้าจอ)

ความสําคัญสูง

PRIORITY_HIGH / PRIORITY_MAX

ส่งเสียง

ค่าเริ่มต้นเริ่มต้น

ค่าเริ่มต้น

ไม่มีเสียง

นําเข้าน้อย

ลําดับความสําคัญต่ํา

ไม่มีเสียงและไม่ปรากฏในแถบสถานะ

นําเข้าขั้นต่ํา

ลําดับความสําคัญ

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

เมื่อสร้างการแจ้งเตือนครั้งแรกในขั้นตอนที่ 1.6 ตัวจับเวลาตัวจับเวลาจะตั้งให้ส่งการแจ้งเตือนที่มีลําดับความสําคัญต่ํา เนื่องจากมีการออกแบบมาเพื่อรบกวนผู้ใช้ด้วยการแจ้งเตือน อย่างไรก็ตาม การดึงดูดความสนใจของผู้ใช้ก่อนจะกลายเป็นไข่ก็เป็นความคิดที่ดี หากต้องการเปลี่ยนระดับความสําคัญของการแจ้งเตือน ให้เริ่มต้นด้วยการตั้งค่าช่อง ความสําคัญของช่องจะส่งผลต่อระดับการขัดข้องของการแจ้งเตือนทั้งหมดที่โพสต์ในช่องและต้องระบุในตัวสร้าง NotificationChannel

  1. หากต้องการเปลี่ยนระดับความสําคัญของช่องทางการแจ้งเตือนของแอป ให้เปิด EggTimerFragment.kt แล้วไปที่ createChannel() เปลี่ยนระดับความสําคัญจาก IMPORTANCE_LOW เป็น IMPORTANCE_HIGH
// EggTimerFragment.kt
    val notificationChannel = NotificationChannel(
        channelId,
        channelName,
        // TODO: Step 2.4 change importance
        NotificationManager.IMPORTANCE_HIGH
    )

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

  1. เปิด NotificationUtils.kt และเพิ่มรายการต่อไปนี้ลงในออบเจ็กต์เครื่องมือสร้างการแจ้งเตือน
// NotificationUtils.kt
   .addAction(
       R.drawable.common_google_signin_btn_icon_dark,
       applicationContext.getString(R.string.snooze),
       snoozePendingIntent
    )
   // TODO: Step 2.5 set priority
    .setPriority(NotificationCompat.PRIORITY_HIGH)
  1. ก่อนเรียกใช้แอป ให้คลิกไอคอนไอคอนแอปในอุปกรณ์หรือโปรแกรมจําลองค้างไว้ แล้วเลือกถอนการติดตั้งเพื่อล้างการตั้งค่าช่องก่อนหน้านี้ หากคุณไม่สามารถถอนการติดตั้งแอป การตั้งค่าลําดับความสําคัญของช่องจะไม่เปลี่ยนแปลง และจะไม่เปลี่ยนแปลงลักษณะการทํางานเมื่อโพสต์การแจ้งเตือน
  2. เรียกใช้แอปอีกครั้งและเริ่มตัวจับเวลา เมื่อระบบส่งการแจ้งเตือน คุณจะเห็นป๊อปอัปปรากฏขึ้นที่ด้านบนของหน้าจอ ไม่ว่าแอปจะทํางานในเบื้องหน้าหรืออยู่เบื้องหลัง

ขั้นตอนที่ 4: ป้ายการแจ้งเตือน

ป้ายการแจ้งเตือนคือจุดเล็กๆ ที่ปรากฏในไอคอน Launcher ของแอปที่เชื่อมโยงเมื่อแอปมีการแจ้งเตือนอยู่ ผู้ใช้กดไอคอนแอปค้างไว้เพื่อแสดงการแจ้งเตือนได้

จุดเหล่านี้เรียกว่าป้ายจะปรากฏโดยค่าเริ่มต้น และคุณไม่ต้องทําอะไรเลย อย่างไรก็ตาม อาจมีบางกรณีที่ป้ายไม่สมเหตุสมผลสําหรับการแจ้งเตือนของคุณ ดังนั้นคุณสามารถปิดใช้ป้ายเหล่านี้สําหรับแต่ละช่องทางได้โดยเรียก setShowBadge(false) บนออบเจ็กต์ NotificationChannel เนื่องจากตัวจับเวลาไข่มีการแจ้งเตือนที่ใช้งานอยู่เพียง 1 ครั้งเท่านั้น ดังนั้นป้ายบนไอคอนแอปจึงไม่มีประโยชน์กับผู้ใช้มากนัก ในขั้นตอนต่อไปนี้จะปิดใช้ป้ายและแสดงเฉพาะการแจ้งเตือนสําหรับตัวจับเวลารูปไข่

  1. เพิ่ม setShowBadge(false) ในโค้ดการสร้างช่องสําหรับตัวจับเวลารูปไข่เพื่อปิดใช้ป้าย
// EggTimerFragment.kt

    ).apply {
        // TODO: Step 2.6 disable badges for this channel
        setShowBadge(false)
    }
  1. เรียกใช้แอปอีกครั้ง เริ่มตัวจับเวลา แล้วดูไอคอนแอป คุณจะไม่เห็นป้ายใดๆ ในไอคอนแอป

รหัสโซลูชันจะอยู่ในสาขาหลักของโค้ดที่คุณดาวน์โหลด

  • ใช้ชั้นเรียน NotificationManager เพื่อสร้าง ส่ง อัปเดต และยกเลิกการแจ้งเตือนโดยใช้
  • ใช้ออบเจ็กต์ NotificationChannel กับเมธอด createNotificationChannel เพื่อตั้งค่าช่องสําหรับการแจ้งเตือน
  • ใช้ addAction() เพื่อเพิ่มการทํางานด่วนลงในการแจ้งเตือน
  • ใช้ setShowBadge() เพื่อเปิดหรือปิดใช้ป้าย
  • จัดรูปแบบการแจ้งเตือนโดยใช้สไตล์ที่ขยายจาก Notification.Style
  • ตั้งค่าระดับความสําคัญด้วย NotificationChannel.setImportance()

หลักสูตร Udacity:

เอกสารประกอบสําหรับนักพัฒนาซอฟต์แวร์ Android

สําหรับลิงก์ไปยังหน้า Codelab อื่นๆ ในหลักสูตรนี้ โปรดดูหน้า Landing Page ขั้นสูงสําหรับ Android ใน Kotlin