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 ได้ด้วย
- เปิดและเรียกใช้แอปใน Android Studio
คุณจะเห็นรูปไข่และเมนูแบบเลื่อนลงที่มีรายการช่วงเวลาที่กําหนดไว้ล่วงหน้าสําหรับทําอาหารไข่ คลิกรูปสามเหลี่ยมสําหรับเมนูแบบเลื่อนลงต้ม Soft ตัวเลือกแรกในรายการมีไว้เพื่อวัตถุประสงค์ในการทดสอบ และตั้งการปลุกเป็น 10 วินาทีเท่านั้น ข้างรายการนี้เป็นสวิตช์ที่เริ่มจับเวลาไข่ คุณใช้สวิตช์นี้เพื่อเริ่มและหยุดตัวจับเวลาของไข่ได้ทุกเมื่อที่ต้องการ โค้ดเริ่มต้นทํางานอย่างสมบูรณ์ ซึ่งหมายความว่าคุณจะตั้งตัวจับเวลารูปไข่และนับเวลาถอยหลังเป็น 0 ได้ เมื่อตัวจับเวลาเสร็จสิ้นแล้ว ข้อความโทสต์จะปรากฏขึ้นดังที่แสดงด้านล่าง
- ตรวจสอบซอร์สโค้ด แอปเริ่มต้นประกอบด้วยกิจกรรมเดียวที่ชื่อ
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: สร้างการแจ้งเตือนพื้นฐาน
ในงานนี้ คุณกําลังสร้างการแจ้งเตือนใหม่ ตั้งค่าข้อความสําหรับผู้ใช้ และส่งการแจ้งเตือน
- เปิดชั้นเรียน
NotificationUtils.kt
แล้วค้นหาTODO: Step 1.1
คุณจะพบสิ่งที่ต้องทําใน Codelab นี้และรหัสแอป - ตรวจสอบฟังก์ชัน
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) {
- รับอินสแตนซ์ของเครื่องมือสร้างการแจ้งเตือน จากนั้นส่งในบริบทของแอปและรหัสช่อง รหัสช่องเป็นค่าสตริงสําหรับช่อง
ช่องทางการแจ้งเตือนเป็นวิธีจัดกลุ่มการแจ้งเตือน นักพัฒนาซอฟต์แวร์และผู้ใช้จะควบคุมการแจ้งเตือนทั้งหมดในช่องได้โดยการจัดกลุ่มการแจ้งเตือนที่คล้ายกันไว้ด้วยกัน เมื่อสร้างช่องแล้ว คุณจะสามารถใช้เพื่อส่งการแจ้งเตือนจํานวนเท่าใดก็ได้
//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)
)
- ตั้งค่าไอคอนการแจ้งเตือนให้แสดงถึงแอป ชื่อ และข้อความเนื้อหาสําหรับข้อความที่ต้องการมอบให้กับผู้ใช้ คุณจะเห็นตัวเลือกเพิ่มเติมเพื่อปรับแต่งการแจ้งเตือนใน 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)
- จากนั้นคุณต้องเรียกใช้
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())
- เปิด
ui/EggTimerViewModel.kt
แล้วหาฟังก์ชันstartTimer()
โดยฟังก์ชันนี้จะสร้างการปลุกด้วยช่วงเวลาที่เลือกเมื่อผู้ใช้เปิดใช้ตัวจับเวลารูปไข่ - คุณจะต้องทริกเกอร์การแจ้งเตือนในฟังก์ชันนี้เมื่อผู้ใช้เริ่มต้นตัวจับเวลา หากต้องการเรียกใช้ฟังก์ชัน
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)
เกือบจะเสร็จแล้ว! แต่หากคุณทําแอปตอนนี้เลยและตั้งค่าตัวจับเวลา คุณจะไม่ได้รับการแจ้งเตือน
- เปิด
logcat
แล้วค้นหา"No Channel found"
คุณควรจะเห็นข้อความแสดงข้อผิดพลาดว่าไม่มีegg_channel
ในขั้นตอนต่อไป คุณจะได้ดูข้อมูลเพิ่มเติมเกี่ยวกับช่องการแจ้งเตือนและแก้ไขปัญหานี้
ขั้นตอนที่ 2: ช่องทางการแจ้งเตือน
ตั้งแต่ API ระดับ 26 จะต้องกําหนดการแจ้งเตือนทั้งหมดให้กับช่อง หากคุณแตะไอคอนตัวเปิดแอปค้างไว้ เลือกข้อมูลแอป และแตะการแจ้งเตือน คุณจะเห็นรายการช่องทางการแจ้งเตือนที่เชื่อมโยงกับแอป และในตอนนี้รายการว่างเปล่าเนื่องจากแอปของคุณยังไม่ได้สร้างช่องทางใดๆ
ช่องแสดงถึงการแจ้งเตือน&ประเภทการแจ้งเตือน เช่น ตัวจับเวลาไข่จะส่งการแจ้งเตือนเมื่อมีการต้มไข่ และใช้ช่องอื่นเพื่อส่งการแจ้งเตือนประจําวันเพื่อช่วยเตือนคุณว่ากําลังทานไข่ด้วย โดยระบบจะจัดกลุ่มการแจ้งเตือนทั้งหมดไว้ในช่องเดียวกัน และผู้ใช้จะกําหนดการตั้งค่าการแจ้งเตือนสําหรับทั้งช่องได้ โดยผู้ใช้จะสามารถปรับเปลี่ยนการตั้งค่าการแจ้งเตือนในแบบของคุณตามประเภทของการแจ้งเตือนที่สนใจ เช่น ผู้ใช้ปิดใช้การแจ้งเตือนมื้อเช้าได้ แต่ยังเลือกดูการแจ้งเตือนจากตัวจับเวลา
นักพัฒนาซอฟต์แวร์ได้ตั้งค่าเริ่มต้น ความสําคัญ และลักษณะการทํางานที่จะใช้กับการแจ้งเตือนทั้งหมดในช่อง หลังจากกําหนดการตั้งค่าเริ่มต้นแล้ว ผู้ใช้จะลบล้างการตั้งค่าเหล่านี้ได้
ในขั้นตอนที่ 1.1 คุณใช้ egg_notification_channel_id
เป็นช่องทางการแจ้งเตือน ดังนั้นตอนนี้คุณจะต้องสร้างและปรับแต่งการตั้งค่าและลักษณะการทํางานของการแจ้งเตือนของช่องนี้
- เปิด
EggTimerFragment.kt
แล้วหาฟังก์ชันcreateChannel()
- ส่งรหัสช่องที่ไม่ซ้ํากันไปยังเครื่องมือสร้าง
NotificationChannel
- ส่งชื่อช่องการแจ้งเตือน ซึ่งผู้ใช้จะเห็นในหน้าจอการตั้งค่าด้วย
- โปรดส่งพารามิเตอร์ระดับความสําคัญสําหรับช่องการแจ้งเตือนเป็นพารามิเตอร์สุดท้าย เราจะกล่าวถึงระดับความสําคัญในภายหลังใน Codelab ดังกล่าว ดังนั้นตอนนี้คุณสามารถใช้
NotificationManag
er.IMPORTANCE_LOW
ได้ - ในออบเจ็กต์
notificationChannel
ตั้งค่าenableLights
เป็น true การตั้งค่านี้จะเปิดใช้หลอดไฟเมื่อแสดงการแจ้งเตือน - ในออบเจ็กต์
notificationChannel
ให้ตั้งค่าlightColor
เป็นสีแดงเพื่อแสดงไฟสีแดงเมื่อแสดงการแจ้งเตือน - ในออบเจ็กต์
notificationChannel
ให้ตั้งค่าenableVibration
เป็น true เพื่อเปิดใช้การสั่น - ในคําอธิบายออบเจ็กต์
notificationChannel
ให้ตั้งค่าเป็น‘Time for breakf
ast' - รับอินสแตนซ์ของ
NotificationManager
โดยโทรไปที่getSystemService()
- เรียกใช้
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
}
- ถัดไป หากต้องการสร้างช่อง คุณต้องเรียกใช้ฟังก์ชัน
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.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)
)
- เรียกใช้แอป และคุณจะเห็นแอปส่งการแจ้งเตือนทุกครั้งที่คุณเริ่มตัวจับเวลา
- ดึงแถบสถานะและสังเกตว่าชื่อ เนื้อหา และไอคอนการแจ้งเตือนเป็นไปตามที่คุณกําหนดไว้ในขั้นตอนก่อนหน้า
- ในการยืนยันช่องที่สร้างใหม่ ให้ปิดแอป แล้วหาไอคอนแอปนั้น แตะไอคอนแอปค้างไว้ แล้วเลือกข้อมูลแอป
- เลือกการแจ้งเตือนจากรายการการตั้งค่า คุณควรเห็นช่องใหม่ที่ชื่อ Egg อยู่ใต้การตั้งค่าแสดงการแจ้งเตือน
เมื่อคุณเรียกใช้แอป ระบบจะแสดงการแจ้งเตือน ทั้งคุณและนักพัฒนาแอปสามารถปรับแต่งการตั้งค่าและลักษณะการทํางานของการแจ้งเตือนทั้งหมดที่ส่งมาในช่องนี้ได้ ยินดีด้วย คุณสร้างการแจ้งเตือนแล้ว
ขั้นตอนที่ 3: เพิ่มการแจ้งเตือนในแอป
ข้อมูลนี้จะแสดงการใช้งาน API การแจ้งเตือนพื้นฐาน แต่การส่งการแจ้งเตือนทันทีหลังจากที่เริ่มตัวจับเวลาไม่สมเหตุสมผล ผู้ใช้อาจเลือกรับการแจ้งเตือนเมื่อไข่พร้อมแล้ว คุณจะแก้ไขโค้ดและเปลี่ยนข้อความโทสต์เป็นการแจ้งเตือนได้ในส่วนต่อไปนี้ของ Codelab
คุณได้ส่งการแจ้งเตือนและสังเกตลักษณะการแสดงให้ผู้ใช้เห็นแล้ว แต่นี่เป็นเพียงขั้นตอนแรกในการสร้างการแจ้งเตือนที่ยอดเยี่ยม ในขั้นตอนนี้ คุณจะต้องเปลี่ยนการแจ้งเตือนให้ส่งในเวลาที่เหมาะสมยิ่งขึ้น
แอปใช้ AlarmManager
เพื่อตั้งปลุก รหัสที่เกี่ยวข้องกับ AlarmManager
จะมีอยู่ในโค้ดเริ่มต้นอยู่แล้วและใช้เพื่อแสดงข้อความโทสต์ AlarmManager
ติดตามการเลือกเวลาที่ต้องการและจะเรียกใช้ฟังก์ชัน onReceive()
ของ AlarmReceiver.kt
เมื่อหมดเวลา หากคุณเปิด AlarmReceiver.kt
และไปยัง onReceive()
คุณควรจะเห็นข้อความโทสต์ปรากฏขึ้นทุกครั้งที่ตั้งค่าตัวจับเวลารูปไข่
- เปิด
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
)
- (ไม่บังคับ) นําข้อความโทสต์ออกเพราะแอปจะส่งการแจ้งเตือนเมื่อหมดเวลา
// AlarmReceiver.kt
// TODO: Step 1.10 [Optional] remove toast
// Toast.makeText(
// context,
// context.getText(R.string.eggs_ready),
// Toast.LENGTH_SHORT
// ).show()
- เรียกใช้แอป คุณควรเห็นการแจ้งเตือนทุกครั้งที่เริ่มตัวจับเวลาและทุกครั้งที่หมดเวลา
วิธีนี้ไม่เหมาะนัก คุณไม่ต้องการส่งการแจ้งเตือนให้ผู้ใช้มากเกินไป คุณนําการแจ้งเตือนแรกที่ส่งเมื่อผู้ใช้เริ่มตัวจับเวลาออกได้
- เปิด
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)
- เรียกใช้แอปอีกครั้ง
- ตั้งตัวจับเวลา วางอยู่เบื้องหลัง และรอเวลาให้เสร็จเรียบร้อย คุณจะเห็นการแจ้งเตือน การแจ้งเตือนนี้มีประโยชน์มากกว่า
ขั้นตอนที่ 4: เพิ่มความตั้งใจด้านเนื้อหา
- เรียกใช้แอปอีกครั้งหากไม่ได้เรียกใช้อยู่แล้ว
- คลิกการแจ้งเตือนนั้น ไม่มีอะไรเกิดขึ้น
การแสดงการแจ้งเตือนและการแจ้งให้ผู้ใช้ทราบว่าเยี่ยมมาก แต่เมื่อผู้ใช้คลิกที่การแจ้งเตือน ผู้ใช้คาดหวังที่จะกลับไปยังแอปที่เกี่ยวข้อง ในส่วนนี้ของ Codelab คุณต้องเพิ่มความตั้งใจในการแจ้งเตือนเพื่อนําผู้ใช้ไปยังหน้าจอตัวจับเวลา
Intent
เป็นออบเจ็กต์การรับส่งข้อความที่ใช้เพื่อขอการทํางานจากคอมโพเนนต์แอปอื่นได้ คุณสามารถใช้ Intent เพื่อเริ่มกิจกรรม บริการ หรือการส่งข้อมูลเตือนภัยได้ ในกรณีนี้ คุณจะใช้ความตั้งใจนี้เพื่อบอกให้ระบบเปิด MainActivity
เมื่อผู้ใช้แตะการแจ้งเตือน เนื่องจากแอปของคุณมีเพียงข้อมูลพร็อพเพอร์ตี้เดียว คุณจึงไม่มีตัวเลือกมากมายในส่วนนี้ อย่างไรก็ตาม ในแอปขนาดใหญ่ การแจ้งเตือนควรสร้างประสบการณ์การใช้งานที่ราบรื่นด้วยการนําผู้ใช้ไปยังหน้าจอที่เหมาะสมเมื่อโต้ตอบกับการแจ้งเตือน
- เปิด
NotificationUtils.kt
แล้วหาฟังก์ชันส่วนขยายsendNotification()
- สร้าง
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 ที่รอดําเนินการเพื่อเปิดแอปแทนคุณ ไม่ว่าแอปตัวจับเวลาจะทํางานหรือไม่ก็ตาม
- สร้าง
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
)
- ส่ง
PendingIntent
ไปยังการแจ้งเตือนของคุณ โดยโทรหาsetContentIntent()
ในNotificationBuilder
ตอนนี้ เมื่อคุณคลิกการแจ้งเตือน ระบบจะเรียกให้PendingIntent
แสดงหน้าMainActivity
ขึ้นมา - และตั้งค่าให้
setAutoCancel()
เป็นtrue
ด้วย เมื่อใดก็ตามที่ผู้ใช้แตะการแจ้งเตือน การแจ้งเตือนจะปิดเองเมื่อนําผู้ใช้ไปยังแอป
// NotificationUtils.kt
// TODO: Step 1.13 set content intent
.setContentIntent(contentPendingIntent)
.setAutoCancel(true)
- เรียกใช้แอปอีกครั้ง
- ตั้งตัวจับเวลา วางแอปในพื้นหลัง และรอให้การแจ้งเตือนปรากฏขึ้น
- เมื่อเห็นการแจ้งเตือน ให้คลิกการแจ้งเตือนโดยดึงแถบสถานะลง แล้วสังเกตดูว่าแอปได้รับเบื้องหน้าอย่างไร
ขั้นตอนที่ 5: ยกเลิกการแจ้งเตือน
ตัวจับเวลาทํางานได้ปกติ พร้อมการแจ้งเตือน แต่มีปัญหาเล็กน้อย หากคุณตั้งตัวจับเวลา รับการแจ้งเตือน และตั้งตัวจับเวลาอีกครั้ง การแจ้งเตือนก่อนหน้าจะยังคงอยู่ในแถบสถานะขณะที่ตัวจับเวลาใหม่ทํางานอยู่ ซึ่งอาจทําให้ผู้ใช้สับสนได้หากแอปทํางานอยู่เบื้องหลังและอาจส่งผลให้ไข่สุกไม่ได้
หากต้องการแก้ไขปัญหานี้ คุณต้องล้างการแจ้งเตือนก่อนหน้าเมื่อเริ่มตัวจับเวลาใหม่ เริ่มต้นด้วยการสร้างฟังก์ชันส่วนขยายอื่นใน NotificationUtils.kt
NotificationManager
มี API เพื่อยกเลิกการแจ้งเตือนที่ใช้งานอยู่ทั้งหมดชื่อ cancelAll
()
- เปิด
NotificationsUtil.kt
- เพิ่มฟังก์ชันส่วนขยายใน
NotificationManager
ซึ่งเรียกใช้cancelAll()
// NotificationUtils.kt
// TODO: Step 1.14 Cancel all notifications
/**
* Cancels all notifications.
*
*/
fun NotificationManager.cancelNotifications() {
cancelAll()
}
- เปิด
EggTimerViewModel.kt
แล้วไปที่ฟังก์ชันstartTimer()
- ใน
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: จัดรูปแบบการแจ้งเตือน
การจัดรูปแบบการแจ้งเตือนตามความต้องการของคุณ และเนื้อหาการแจ้งเตือนจะทําให้การแจ้งเตือนโดดเด่นและมีลักษณะเหมือนส่วนขยายของแอปพลิเคชัน เฟรมเวิร์กการแจ้งเตือนนี้มาพร้อมสไตล์ในตัวที่หลากหลายและคุณสามารถสร้างสไตล์ของตัวเองได้ทุกเมื่อ
NotificationCompat
นําเสนอฟีเจอร์ในตัวสําหรับ
BigTextStyle
ซึ่งแสดงกลุ่มข้อความขนาดใหญ่ได้ เช่น การแสดงเนื้อหาอีเมลเมื่อขยายBigPictureStyle
ซึ่งแสดงการแจ้งเตือนรูปแบบขนาดใหญ่ที่มีไฟล์แนบรูปภาพขนาดใหญ่InboxStyle
ซึ่งแสดงเนื้อหารูปแบบการสนทนาMediaStyle
ซึ่งแสดงตัวควบคุมสําหรับการเล่นสื่อMessagingStyle
ซึ่งแสดงการแจ้งเตือนรูปแบบขนาดใหญ่ที่มีหลายข้อความระหว่างจํานวนคน
คุณดูข้อมูลเพิ่มเติมเกี่ยวกับสไตล์อื่นๆ ได้ในเอกสารประกอบสําหรับสร้างการแจ้งเตือนที่ขยายได้ ในขั้นตอนนี้ คุณจะใช้ NotificationCompat.BigPictureStyle
เพื่อสร้างการแจ้งเตือนที่ขยายได้ซึ่งแสดงรูปภาพไข่ขนาดใหญ่เมื่อขยาย
- เปิด
NotificationUtils.kt
แล้วหาฟังก์ชันsendNotification()
- เริ่มต้นด้วยการโหลดรูปภาพจาก
resources
โดยใช้BitmapFactory
// NotificationUtils.kt
// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
applicationContext.resources,
R.drawable.cooked_egg
)
- สร้าง
BigPictureStyle
ใหม่และตั้งค่ารูปภาพของคุณ - ตั้งค่า
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)
- ตั้งค่ารูปแบบด้วย
setStyle()
เป็นbigPicStyle
- ตั้งค่าไอคอนขนาดใหญ่ด้วย
setLargeIcon()
เป็นeggImage
รูปภาพจะแสดงเป็นไอคอนขนาดเล็กเมื่อยุบการแจ้งเตือน
// NotificationUtils.kt
// TODO: Step 2.1 add style to builder
.setStyle(bigPicStyle)
.setLargeIcon(eggImage)
- เรียกใช้แอปและตั้งตัวจับเวลา เมื่อมีการแสดงการแจ้งเตือนเป็นครั้งแรก การแจ้งเตือนนั้นจะอยู่ในสถานะยุบในลิ้นชักการแจ้งเตือน หากคุณขยายการแจ้งเตือน รูปภาพขนาดใหญ่จะแสดงในพื้นที่การแจ้งเตือนแบบขยาย
ขั้นตอนที่ 2: การดําเนินการแจ้งเตือน
การทํางานของการแจ้งเตือนเป็นการปรับแต่งอีกแบบหนึ่งที่คุณเพิ่มลงในการแจ้งเตือนได้ ปัจจุบันการแจ้งเตือนเปลี่ยนเส้นทางไปยังแอปเมื่อผู้ใช้คลิกการแจ้งเตือน นอกเหนือจากการทํางานการแจ้งเตือนเริ่มต้นนี้ คุณยังเพิ่มปุ่มการทํางานซึ่งทํางานที่เกี่ยวข้องกับแอปจากการแจ้งเตือนได้อีกด้วย
การแจ้งเตือนจะแสดงปุ่มการทํางานสูงสุด 3 ปุ่มเพื่อให้ผู้ใช้ตอบกลับได้อย่างรวดเร็ว เช่น การเลื่อนการช่วยเตือนหรือการตอบกลับ SMS ปุ่มการทํางานเหล่านี้ไม่ควรตรงกับการดําเนินการที่เกิดขึ้นเมื่อผู้ใช้แตะการแจ้งเตือน
หากต้องการเพิ่มปุ่มการทํางาน ให้ส่ง PendingIntent
ไปยังฟังก์ชัน addAction()
ในเครื่องมือสร้าง ซึ่งคล้ายกับการตั้งค่าการทํางานด้วยการแตะเริ่มต้นของการแจ้งเตือนโดยเรียก setContentIntent()
ยกเว้นการดําเนินการอื่นๆ เช่น เริ่มต้น BroadcastReceiver
ที่ทํางานในเบื้องหลังเพื่อให้การดําเนินการไม่รบกวนแอปที่เปิดอยู่แล้ว ยกเว้นการเปิดใช้กิจกรรม
ใน Codelab นี้ คุณได้รับ BoadcastReceiver
ชื่อ SnoozeReceiver
อยู่แล้ว คุณจะใช้ SnoozeReceiver
เพื่อรับการคลิกของผู้ใช้บนการแจ้งเตือน ในขั้นตอนต่อไป คุณจะต้องเพิ่มโค้ดเพื่อเลื่อนการแจ้งเตือนตัวจับเวลาของไข่เป็นเวลา 60 วินาทีเมื่อผู้ใช้คลิกปุ่มเลื่อนการปลุก เมื่อคลิกการดําเนินการเลื่อนการปลุก SnoozeReceiver
จะได้รับความตั้งใจและจะสร้างการปลุกใหม่เพื่อส่งการแจ้งเตือนใหม่หลังผ่านไป 60 วินาที
- เปิด
SnoozeReceiver.kt
ชั้นเรียนนี้คล้ายกับAlarmReceiver
ที่คุณเคยใช้ก่อนหน้านี้ ในขั้นตอนต่อไป คุณจะต้องเพิ่มโค้ดซึ่งจะทําให้ฟังก์ชันonReceive()
ของSnoozeReceiver
ทํางาน สรุปคือ รหัสในSnoozeReceiver
จะสร้างการปลุกใหม่เพื่อส่งการแจ้งเตือนใหม่หลังผ่านไป 1 นาที เลื่อนลงไปที่ด้านล่างของฟังก์ชัน onReceive แล้วรับอินสแตนซ์ Alert Manager จากระบบและเรียกการยกเลิกทั้งหมด
// SnoozeReceiver.kt
val notificationManager = ContextCompat.getSystemService(
context,
NotificationManager::class.java
) as NotificationManager
notificationManager.cancelAll()
- หากต้องการใช้
SnoozeReceiver
ให้เปิดNotificationUtils.kt
- สร้าง
Intent
snoozeIntent
ใหม่สําหรับSnoozeReceiver
หลังรูปแบบในฟังก์ชันsendNotification()
- สร้าง Intent ที่รอดําเนินการโดยเรียกเมธอด
getBroadcast()
ในPendingIntent
ซึ่งคาดว่าจะพบพารามิเตอร์ในขั้นตอนต่อไปนี้ ระบบจะใช้PendingIntent
นี้ในการตั้งปลุกใหม่เพื่อโพสต์การแจ้งเตือนใหม่หลังจากผ่านไป 60 วินาทีเมื่อผู้ใช้แตะปุ่มเลื่อนการปลุก - พารามิเตอร์แรกคือบริบทแอปพลิเคชันที่
PendingIntent
นี้ควรเริ่มกิจกรรม - พารามิเตอร์ที่ 2 คือโค้ดคําขอ ซึ่งเป็นโค้ดคําขอสําหรับ Intent ที่รอดําเนินการนี้ หากต้องการอัปเดตหรือยกเลิกความตั้งใจที่รอดําเนินการนี้ คุณต้องใช้รหัสนี้เพื่อเข้าถึงความตั้งใจที่รอดําเนินการ
- จากนั้นให้เพิ่มออบเจ็กต์
snoozeIntent
ซึ่งเป็นวัตถุประสงค์ของกิจกรรมที่จะเปิดตัว - ขั้นตอนสุดท้าย ให้เพิ่มค่าธง
#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
)
- จากนั้นเรียกใช้ฟังก์ชัน
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 นาที
ขั้นตอนที่ 3: ความสําคัญของการแจ้งเตือน
ความสําคัญจะเป็นตัวกําหนดว่าการแจ้งเตือนควรรบกวนผู้ใช้ทั้งภาพและเสียง การแจ้งเตือนที่มีความสําคัญสูงกว่าจะรบกวนผู้ใช้มากกว่า
คุณต้องระบุระดับความสําคัญในเครื่องมือสร้าง NotificationChannel
ก่อนหน้านี้คุณตั้งค่าลําดับความสําคัญต่ําให้แอปตัวจับเวลาไข่ คุณสามารถใช้ระดับความสําคัญจาก 5 ระดับตั้งแต่ IMPORTANCE_NONE(0)
ถึง IMPORTANCE_HIGH(4)
ระดับความสําคัญที่คุณกําหนดให้กับช่องจะใช้กับข้อความแจ้งเตือนทั้งหมดที่คุณโพสต์ลงในช่อง
ระดับความสําคัญของช่อง
ระดับความสําคัญที่ผู้ใช้เห็น | ความสําคัญ (Android 8.0 ขึ้นไป) | ลําดับความสําคัญ (Android 7.1 และต่ํากว่า) |
ส่งเสียงและปรากฏเป็นการแจ้งเตือนล่วงหน้า (ป๊อปอัปที่ด้านบนของหน้าจอ) | ||
ส่งเสียง | ||
ไม่มีเสียง | ||
ไม่มีเสียงและไม่ปรากฏในแถบสถานะ |
หากต้องการข้อมูลเกี่ยวกับการเลือกระดับความสําคัญที่เหมาะสม โปรดดู "ลําดับความสําคัญระดับ" ในคู่มือการออกแบบการแจ้งเตือน โปรดระมัดระวังเมื่อเลือกระดับความสําคัญสําหรับการแจ้งเตือนในแอป คุณควรเลือกความสําคัญของช่องโดยคํานึงถึงเวลาและความสนใจของผู้ใช้ เมื่อการแจ้งเตือนที่ไม่สําคัญแฝงมาแบบเร่งด่วน จะทําให้การตั้งปลุกโดยไม่จําเป็นและทําให้เสียสมาธิได้ ผู้ใช้จะควบคุมระดับความสําคัญของการแจ้งเตือนได้อย่างเต็มที่ ดังนั้นหากคุณสร้างการแจ้งเตือนที่น่ารําคาญ ผู้ใช้จะปิดการแจ้งเตือนช่องทางของคุณโดยสิ้นเชิงได้
เมื่อสร้างการแจ้งเตือนครั้งแรกในขั้นตอนที่ 1.6 ตัวจับเวลาตัวจับเวลาจะตั้งให้ส่งการแจ้งเตือนที่มีลําดับความสําคัญต่ํา เนื่องจากมีการออกแบบมาเพื่อรบกวนผู้ใช้ด้วยการแจ้งเตือน อย่างไรก็ตาม การดึงดูดความสนใจของผู้ใช้ก่อนจะกลายเป็นไข่ก็เป็นความคิดที่ดี หากต้องการเปลี่ยนระดับความสําคัญของการแจ้งเตือน ให้เริ่มต้นด้วยการตั้งค่าช่อง ความสําคัญของช่องจะส่งผลต่อระดับการขัดข้องของการแจ้งเตือนทั้งหมดที่โพสต์ในช่องและต้องระบุในตัวสร้าง NotificationChannel
- หากต้องการเปลี่ยนระดับความสําคัญของช่องทางการแจ้งเตือนของแอป ให้เปิด
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
- เปิด
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)
- ก่อนเรียกใช้แอป ให้คลิกไอคอนไอคอนแอปในอุปกรณ์หรือโปรแกรมจําลองค้างไว้ แล้วเลือกถอนการติดตั้งเพื่อล้างการตั้งค่าช่องก่อนหน้านี้ หากคุณไม่สามารถถอนการติดตั้งแอป การตั้งค่าลําดับความสําคัญของช่องจะไม่เปลี่ยนแปลง และจะไม่เปลี่ยนแปลงลักษณะการทํางานเมื่อโพสต์การแจ้งเตือน
- เรียกใช้แอปอีกครั้งและเริ่มตัวจับเวลา เมื่อระบบส่งการแจ้งเตือน คุณจะเห็นป๊อปอัปปรากฏขึ้นที่ด้านบนของหน้าจอ ไม่ว่าแอปจะทํางานในเบื้องหน้าหรืออยู่เบื้องหลัง
ขั้นตอนที่ 4: ป้ายการแจ้งเตือน
ป้ายการแจ้งเตือนคือจุดเล็กๆ ที่ปรากฏในไอคอน Launcher ของแอปที่เชื่อมโยงเมื่อแอปมีการแจ้งเตือนอยู่ ผู้ใช้กดไอคอนแอปค้างไว้เพื่อแสดงการแจ้งเตือนได้
จุดเหล่านี้เรียกว่าป้ายจะปรากฏโดยค่าเริ่มต้น และคุณไม่ต้องทําอะไรเลย อย่างไรก็ตาม อาจมีบางกรณีที่ป้ายไม่สมเหตุสมผลสําหรับการแจ้งเตือนของคุณ ดังนั้นคุณสามารถปิดใช้ป้ายเหล่านี้สําหรับแต่ละช่องทางได้โดยเรียก setShowBadge(false)
บนออบเจ็กต์ NotificationChannel
เนื่องจากตัวจับเวลาไข่มีการแจ้งเตือนที่ใช้งานอยู่เพียง 1 ครั้งเท่านั้น ดังนั้นป้ายบนไอคอนแอปจึงไม่มีประโยชน์กับผู้ใช้มากนัก ในขั้นตอนต่อไปนี้จะปิดใช้ป้ายและแสดงเฉพาะการแจ้งเตือนสําหรับตัวจับเวลารูปไข่
- เพิ่ม
setShowBadge(false)
ในโค้ดการสร้างช่องสําหรับตัวจับเวลารูปไข่เพื่อปิดใช้ป้าย
// EggTimerFragment.kt
).apply {
// TODO: Step 2.6 disable badges for this channel
setShowBadge(false)
}
- เรียกใช้แอปอีกครั้ง เริ่มตัวจับเวลา แล้วดูไอคอนแอป คุณจะไม่เห็นป้ายใดๆ ในไอคอนแอป
รหัสโซลูชันจะอยู่ในสาขาหลักของโค้ดที่คุณดาวน์โหลด
- ใช้ชั้นเรียน NotificationManager เพื่อสร้าง ส่ง อัปเดต และยกเลิกการแจ้งเตือนโดยใช้
- ใช้ออบเจ็กต์ NotificationChannel กับเมธอด createNotificationChannel เพื่อตั้งค่าช่องสําหรับการแจ้งเตือน
- ใช้ addAction() เพื่อเพิ่มการทํางานด่วนลงในการแจ้งเตือน
- ใช้ setShowBadge() เพื่อเปิดหรือปิดใช้ป้าย
- จัดรูปแบบการแจ้งเตือนโดยใช้สไตล์ที่ขยายจาก Notification.Style
- ตั้งค่าระดับความสําคัญด้วย NotificationChannel.setImportance()
หลักสูตร Udacity:
เอกสารประกอบสําหรับนักพัฒนาซอฟต์แวร์ Android
สําหรับลิงก์ไปยังหน้า Codelab อื่นๆ ในหลักสูตรนี้ โปรดดูหน้า Landing Page ขั้นสูงสําหรับ Android ใน Kotlin