ใช้บับเบิลการแจ้งเตือนสำหรับการสนทนา

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

รูปที่ 1 บับเบิลแชท

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

เมื่ออุปกรณ์ล็อกอยู่หรือเปิดใช้งานฟีเจอร์ Always-on Display บับเบิลจะปรากฏเป็นการแจ้งเตือนตามปกติ

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

ผู้ใช้สามารถทำสิ่งต่อไปนี้ได้

  • บล็อกบับเบิลการแจ้งเตือนทั้งหมดจากแอป การแจ้งเตือนจะไม่ถูกบล็อก แต่จะไม่ปรากฏเป็นบับเบิล
  • อนุญาตบับเบิลการแจ้งเตือนที่เลือกจากแอป การแจ้งเตือนที่ปรากฏเป็นบับเบิลโดยใช้ปุ่มบับเบิลจะถือว่า "เลือก" แล้ว
  • อนุญาตบับเบิลการแจ้งเตือนทั้งหมดจากแอป การแจ้งเตือนทั้งหมดที่ส่งด้วย 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" โดยอัตโนมัติ

หากต้องการส่งบับเบิลการแจ้งเตือน ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างการแจ้งเตือนตามปกติ
  2. เรียกใช้ BubbleMetadata.Builder(PendingIntent, Icon) หรือ BubbleMetadata.Builder(String) เพื่อสร้างออบเจ็กต์ BubbleMetadata
  3. ใช้ setBubbleMetadata() เพื่อเพิ่มข้อมูลเมตาลงในการแจ้งเตือน
  4. หากกำหนดเป้าหมายเป็น Android 11 (ระดับ API 30) ขึ้นไป ให้ตรวจสอบว่าข้อมูลเมตาของบับเบิลหรือการแจ้งเตือนอ้างอิงถึงทางลัดการแชร์
  5. แก้ไขแอปไม่ให้ ยกเลิกการแจ้งเตือนที่ปรากฏเป็นบับเบิล การยกเลิกการแจ้งเตือนจะนำบับเบิลออกจากหน้าจอ การเปิดบับเบิลจะซ่อนการแจ้งเตือนที่เชื่อมโยงกับบับเบิลโดยอัตโนมัติ

ขั้นตอนเหล่านี้แสดงไว้ในตัวอย่างต่อไปนี้

// 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. ใช้บริบทของกิจกรรมเมื่อเปิดใช้ Intent, activity.startActivity(intent), และ 1. อย่าตั้งค่าแฟล็ก FLAG_ACTIVITY_NEW_TASK ใน Intent

มิเช่นนั้น ระบบจะเริ่มกิจกรรมใหม่ในงานใหม่และยุบบับเบิล

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

แนวทางปฏิบัติแนะนำ

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

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

  • อัปเดต BubbleMetadata เพื่อระงับการแจ้งเตือน เรียกใช้ BubbleMetadata.Builder.setSuppressNotification() ซึ่งจะนำไอคอนป้ายออกเพื่อระบุว่าผู้ใช้โต้ตอบกับข้อความแล้ว
  • ตั้งค่า Notification.Builder.setOnlyAlertOnce() เป็น true เพื่อระงับเสียงหรือการสั่นที่มาพร้อมกับการอัปเดต BubbleMetadata

แอปตัวอย่าง

แอปตัวอย่าง SociaLite เป็นแอปการสนทนาที่ใช้ บับเบิล แอปนี้ใช้แชทบ็อตเพื่อวัตถุประสงค์ในการสาธิต ในแอปพลิเคชันจริง ให้ใช้บับเบิลสำหรับข้อความจากบุคคล