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

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

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

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

เมื่ออุปกรณ์ล็อกอยู่หรือจอแสดงผลเปิดตลอดเวลาทำงานอยู่ บับเบิลจะปรากฏขึ้นเหมือนกับการแจ้งเตือนตามปกติ

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

ผู้ใช้จะทำสิ่งต่อไปนี้ได้

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

  • การแจ้งเตือนใช้ 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 เป็นแอปสนทนาโต้ตอบที่ใช้บับเบิล แอปนี้ใช้แชทบ็อตเพื่อวัตถุประสงค์ในการสาธิต ในการใช้งานจริง ให้ใช้บับเบิลสำหรับข้อความจากมนุษย์