บับเบิลการแจ้งเตือนช่วยให้ผู้ใช้เห็นและเข้าร่วมการสนทนาได้ง่ายขึ้น
โดยจะลอยอยู่ด้านบนของเนื้อหาแอปอื่นๆ และผู้ใช้สามารถขยายบับเบิลเพื่อแสดงและโต้ตอบกับเนื้อหาแอป และยุบบับเบิลได้เมื่อไม่ได้ใช้งาน
เมื่ออุปกรณ์ล็อกอยู่หรือจอแสดงผลเปิดตลอดเวลาทำงานอยู่ บับเบิลจะปรากฏขึ้นเหมือนกับการแจ้งเตือนตามปกติ
ผู้ใช้เปิดใช้บับเบิลการแจ้งเตือน โดยแตะปุ่มบับเบิลในการแจ้งเตือนที่รองรับบับเบิล ซึ่งจะช่วยให้แชทนั้นๆ แสดงเป็นบับเบิลเสมอ ผู้ใช้สามารถปรับแชทที่ต้องการให้แสดงเป็นบับเบิลหรือแก้ไขการตั้งค่าสำหรับแอปโดยรวมได้ในการตั้งค่า
ผู้ใช้จะทำสิ่งต่อไปนี้ได้
- บล็อกบับเบิลการแจ้งเตือนทั้งหมดจากแอปของคุณ ระบบจะไม่บล็อกการแจ้งเตือน แต่การแจ้งเตือนจะไม่ปรากฏเป็นบับเบิล
- อนุญาตบับเบิลการแจ้งเตือนที่เลือกจากแอปของคุณ การแจ้งเตือนที่แสดงเป็นบับเบิลโดยใช้ปุ่มบับเบิลจะถือว่า "เลือกแล้ว"
- อนุญาตบับเบิลการแจ้งเตือนทั้งหมดจากแอปของคุณ การแจ้งเตือนทั้งหมดที่ส่งด้วย
BubbleMetadataจะปรากฏเป็นบับเบิล
Notification Bubble API
บับเบิลการแจ้งเตือนสร้างขึ้นโดยใช้ Notification API หากต้องการให้การแจ้งเตือนปรากฏเป็นบับเบิล ให้แนบข้อมูลเพิ่มเติมลงในการแจ้งเตือน
มุมมองแบบขยายของบับเบิลสร้างขึ้นจากกิจกรรมที่คุณเลือก กำหนดค่ากิจกรรมให้ปรากฏเป็นบับเบิลอย่างถูกต้อง กิจกรรมต้องปรับขนาดได้และฝังได้ หากขาดข้อกำหนดข้อใดข้อหนึ่ง ระบบจะแสดงเป็นข้อความแจ้งเตือนแทน
โค้ดต่อไปนี้แสดงวิธีใช้บับเบิล
<activity
android:name=".bubbles.BubbleActivity"
android:theme="@style/AppTheme.NoActionBar"
android:label="@string/title_activity_bubble"
android:allowEmbedded="true"
android:resizeableActivity="true"
/>
หากแอปแสดงบับเบิลหลายรายการที่เป็นประเภทเดียวกัน เช่น การสนทนาแชทหลายรายการกับรายชื่อติดต่อที่ต่างกัน กิจกรรมต้องสามารถเปิดอินสแตนซ์หลายรายการได้ ในอุปกรณ์ที่ใช้ Android 10 และต่ำกว่า การแจ้งเตือนจะไม่แสดงเป็นบับเบิล เว้นแต่คุณจะตั้งค่า documentLaunchMode เป็น "always" อย่างชัดแจ้ง ตั้งแต่ Android 11 เป็นต้นไป คุณไม่จำเป็นต้องตั้งค่านี้อย่างชัดแจ้ง เนื่องจากระบบจะตั้งค่า documentLaunchMode ของการสนทนาทั้งหมดเป็น "always" โดยอัตโนมัติ
หากต้องการส่งบับเบิลการแจ้งเตือน ให้ทำตามขั้นตอนต่อไปนี้
- สร้างการแจ้งเตือนตามปกติ
- เรียกใช้
BubbleMetadata.Builder(PendingIntent, Icon)หรือBubbleMetadata.Builder(String)เพื่อสร้างออบเจ็กต์BubbleMetadata - ใช้
setBubbleMetadata()เพื่อเพิ่มข้อมูลเมตาลงในการแจ้งเตือน - หากกำหนดเป้าหมายเป็น Android 11 (ระดับ API 30) ขึ้นไป โปรดตรวจสอบว่าข้อมูลเมตาหรือการแจ้งเตือนของบับเบิลอ้างอิงทางลัดการแชร์
- แก้ไขแอปเพื่อไม่ยกเลิกการแจ้งเตือนที่ปรากฏเป็นบับเบิล การยกเลิกการแจ้งเตือนจะนำบับเบิลออกจากหน้าจอ การเปิดบับเบิลจะซ่อนการแจ้งเตือนที่เชื่อมโยงกับบับเบิลนั้นโดยอัตโนมัติ
ขั้นตอนเหล่านี้แสดงในตัวอย่างต่อไปนี้
// Create a bubble intent. val target = Intent(context, BubbleActivity::class.java) val bubbleIntent = PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* flags */) val category = "com.example.category.IMG_SHARE_TARGET" val chatPartner = Person.Builder() .setName("Chat partner") .setImportant(true) .build() // Create a sharing shortcut. val shortcutId = generateShortcutId() val shortcut = ShortcutInfoCompat.Builder(context, shortcutId) .setCategories(setOf(category)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel("Chat partner name") .build() // Publish the shortcut, otherwise the bubble metadata will not apply. ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) // Create a bubble metadata. val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent, IconCompat.createWithResource(context, R.drawable.ic_logo)) .setDesiredHeight(600) .build() // Create a notification, referencing the sharing shortcut. val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.chat) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
หากแอปอยู่เบื้องหน้าเมื่อมีการส่งบับเบิล ระบบจะไม่สนใจความสำคัญและจะแสดงบับเบิลเสมอ เว้นแต่ผู้ใช้จะบล็อกบับเบิลหรือการแจ้งเตือนจากแอป
สร้างบับเบิลแบบขยาย
คุณสามารถกำหนดค่าบับเบิลให้แสดงในสถานะขยายโดยอัตโนมัติได้ เราขอแนะนำให้ใช้ฟีเจอร์นี้เฉพาะในกรณีที่ผู้ใช้ดำเนินการที่ทำให้เกิดบับเบิล เช่น แตะปุ่มเพื่อเริ่มแชทใหม่ ในกรณีนี้ การระงับการแจ้งเตือนครั้งแรกที่ส่งเมื่อสร้างบับเบิลก็เป็นสิ่งที่สมเหตุสมผลเช่นกัน
คุณสามารถใช้วิธีการต่างๆ เพื่อตั้งค่าแฟล็กที่เปิดใช้ลักษณะการทำงานเหล่านี้ได้ ดังนี้
setAutoExpandBubble()
และ
setSuppressNotification()
ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าบับเบิลให้แสดงในสถานะขยายโดยอัตโนมัติ
val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
วงจรของเนื้อหาบับเบิล
เมื่อขยายบับเบิล กิจกรรมเนื้อหาจะผ่านวงจรกระบวนการปกติ ซึ่งส่งผลให้แอปพลิเคชันกลายเป็นกระบวนการที่ทำงานอยู่เบื้องหน้า หากยังไม่ได้เป็น
เมื่อบับเบิลยุบหรือปิดไป กิจกรรมจะถูกทำลาย ซึ่งอาจส่งผลให้กระบวนการถูกแคชและถูกปิดในภายหลัง ทั้งนี้ขึ้นอยู่กับว่าแอปมีคอมโพเนนต์อื่นๆ ที่ทำงานอยู่เบื้องหน้าหรือไม่
เมื่อบับเบิลปรากฏขึ้น
เพื่อลดการรบกวนผู้ใช้ บับเบิลจะปรากฏในบางสถานการณ์เท่านั้น
หากแอปกำหนดเป้าหมายเป็น Android 11 (ระดับ API 30) ขึ้นไป การแจ้งเตือนจะไม่ปรากฏเป็นบับเบิล เว้นแต่จะเป็นไปตามข้อกำหนดการสนทนา หากแอปกำหนดเป้าหมายเป็น Android 10 (ระดับ API 29) หรือต่ำกว่า การแจ้งเตือนจะปรากฏเป็นบับเบิลก็ต่อเมื่อเป็นไปตามเงื่อนไขต่อไปนี้อย่างน้อย 1 ข้อ
- การแจ้งเตือนใช้
MessagingStyleและมีการเพิ่มPerson - การแจ้งเตือนมาจากการโทรไปยัง
Service.startForegroundมีcategoryเป็นCATEGORY_CALLและมีการเพิ่มPerson - แอปอยู่เบื้องหน้าเมื่อมีการส่งการแจ้งเตือน
หากไม่เป็นไปตามเงื่อนไขเหล่านี้ ระบบจะแสดงการแจ้งเตือนแทนบับเบิล
การเปิดกิจกรรมจากบับเบิล
เมื่อบับเบิลเปิดกิจกรรมใหม่ กิจกรรมใหม่จะเปิดขึ้นภายในงานเดียวกันและหน้าต่างบับเบิลเดียวกัน หรือในงานใหม่แบบเต็มหน้าจอ โดยจะยุบบับเบิลที่เปิดกิจกรรมนั้น
วิธีเปิดกิจกรรมใหม่ในงานเดียวกับบับเบิล
1. ใช้บริบทกิจกรรมเมื่อเปิด Intent
activity.startActivity(intent) และ
1. อย่าตั้งค่าแฟล็ก FLAG_ACTIVITY_NEW_TASK ใน Intent
ไม่เช่นนั้น กิจกรรมใหม่จะเริ่มในงานใหม่และบับเบิลจะยุบลง
โปรดทราบว่าบับเบิลแสดงถึงการสนทนาที่เฉพาะเจาะจง ดังนั้นกิจกรรมที่เปิดขึ้นภายในบับเบิลควรเกี่ยวข้องกับการสนทนานั้น นอกจากนี้ การเปิดกิจกรรมภายในบับเบิลจะเพิ่มสแต็กงานของบับเบิลและอาจทำให้ประสบการณ์ของผู้ใช้ซับซ้อนขึ้น โดยเฉพาะเกี่ยวกับการนำทาง
แนวทางปฏิบัติแนะนำ
- ส่งการแจ้งเตือนเป็นบับเบิลเฉพาะในกรณีที่สำคัญเท่านั้น เช่น เมื่อเป็นส่วนหนึ่งของการสื่อสารที่ดำเนินอยู่ หรือหากผู้ใช้ขอบับเบิลสำหรับเนื้อหาอย่างชัดแจ้ง บับเบิลใช้พื้นที่หน้าจอและบดบังเนื้อหาแอปอื่นๆ
- ตรวจสอบว่าการแจ้งเตือนแบบบับเบิลทำงานเหมือนการแจ้งเตือนปกติด้วย เมื่อผู้ใช้ปิดใช้บับเบิล การแจ้งเตือนบับเบิลจะแสดงเป็นการแจ้งเตือนปกติ
- ใช้คอมโพสิเบิล
BackHandlerและเชื่อมโยงพารามิเตอร์enabledกับสถานะ UI เพื่อให้ขัดจังหวะการกดปุ่มย้อนกลับเมื่อจำเป็นเท่านั้น เมื่อตัวแฮนเดิลปิดใช้ตัวเอง บับเบิลจะยุบลง
เมื่อบับเบิลที่ยุบได้รับข้อความที่อัปเดต บับเบิลจะแสดงไอคอนป้ายเพื่อระบุข้อความที่ยังไม่อ่าน เมื่อผู้ใช้เปิดข้อความในแอปที่เชื่อมโยง ให้ทำตามขั้นตอนต่อไปนี้
- อัปเดต
BubbleMetadataเพื่อระงับการแจ้งเตือน โทรBubbleMetadata.Builder.setSuppressNotification()ซึ่งจะนำไอคอนป้ายออกเพื่อระบุว่าผู้ใช้โต้ตอบกับข้อความแล้ว - ตั้งค่า
Notification.Builder.setOnlyAlertOnce()เป็นtrueเพื่อระงับเสียงหรือการสั่นที่มาพร้อมกับการอัปเดตBubbleMetadata
แอปตัวอย่าง
แอปตัวอย่าง SociaLite เป็นแอปสนทนาโต้ตอบที่ใช้บับเบิล แอปนี้ใช้แชทบ็อตเพื่อวัตถุประสงค์ในการสาธิต ในการใช้งานจริง ให้ใช้บับเบิลสำหรับข้อความจากมนุษย์