ใช้บับเบิลเพื่ออนุญาตให้ผู้ใช้เข้าร่วมการสนทนา

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

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

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

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

บับเบิลเป็นฟีเจอร์แบบเลือกไม่ใช้ เมื่อแอปแสดงบับเบิลแรก กล่องโต้ตอบขอสิทธิ์จะมี 2 ตัวเลือกให้เลือก ดังนี้

  • บล็อกฟองทั้งหมดจากแอป การแจ้งเตือนจะไม่ถูกบล็อก แต่จะไม่ปรากฏเป็นฟอง
  • อนุญาตลูกโป่งทั้งหมดจากแอปของคุณ การแจ้งเตือนทั้งหมดที่ส่งด้วย BubbleMetaData จะปรากฏเป็นลูกโป่ง

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 ขึ้นไป ให้ตรวจสอบว่าข้อมูลเมตาของบับเบิล หรือการอ้างอิงการแจ้งเตือนอ้างอิงถึงทางลัดการแชร์
  5. แก้ไขแอปไม่ให้ยกเลิกการแจ้งเตือนที่ปรากฏเป็นบับเบิล หากต้องการตรวจสอบว่ากิจกรรมการแจ้งเตือนเปิดเป็นบับเบิลหรือไม่ ให้เรียกใช้ Activity#isLaunchedFromBubble() การยกเลิกการแจ้งเตือนจะเป็นการนำบับเบิลออกจากหน้าจอ การเปิดบับเบิล จะซ่อนการแจ้งเตือนที่เชื่อมโยงกับบับเบิลนั้นโดยอัตโนมัติ

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

Kotlin

// Create a bubble intent.
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* 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 =
   ShortcutInfo.Builder(mContext, shortcutId)
       .setCategories(setOf(category))
       .setIntent(Intent(Intent.ACTION_DEFAULT))
       .setLongLived(true)
       .setShortLabel(chatPartner.name)
       .build()

// Create a bubble metadata.
val bubbleData = Notification.BubbleMetadata.Builder(bubbleIntent,
            Icon.createWithResource(context, R.drawable.icon))
    .setDesiredHeight(600)
    .build()

// Create a notification, referencing the sharing shortcut.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setBubbleMetadata(bubbleData)
    .setShortcutId(shortcutId)
    .addPerson(chatPartner)

Java

// Create a bubble intent.
Intent target = new Intent(mContext, BubbleActivity.class);
PendingIntent bubbleIntent =
    PendingIntent.getActivity(mContext, 0, target, 0 /* flags */);

private val CATEGORY_TEXT_SHARE_TARGET =
    "com.example.category.IMG_SHARE_TARGET"

Person chatPartner = new Person.Builder()
        .setName("Chat partner")
        .setImportant(true)
        .build();

// Create a sharing shortcut.
private String shortcutId = generateShortcutId();
ShortcutInfo shortcut =
   new ShortcutInfo.Builder(mContext, shortcutId)
       .setCategories(Collections.singleton(CATEGORY_TEXT_SHARE_TARGET))
       .setIntent(Intent(Intent.ACTION_DEFAULT))
       .setLongLived(true)
       .setShortLabel(chatPartner.getName())
       .build();

// Create a bubble metadata.
Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder(bubbleIntent,
            Icon.createWithResource(context, R.drawable.icon))
        .setDesiredHeight(600)
        .build();

// Create a notification, referencing the sharing shortcut.
Notification.Builder builder =
    new Notification.Builder(mContext, CHANNEL_ID)
        .setContentIntent(contentIntent)
        .setSmallIcon(smallIcon)
        .setBubbleMetadata(bubbleData)
        .setShortcutId(shortcutId)
        .addPerson(chatPartner);

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

สร้างบับเบิลที่ขยายได้

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

คุณสามารถใช้วิธีการต่อไปนี้เพื่อตั้งค่าสถานะที่เปิดใช้ลักษณะการทำงานเหล่านี้ setAutoExpandBubble() และ setSuppressNotification()

ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าบับเบิลให้แสดงโดยอัตโนมัติ ในสถานะขยาย

Kotlin

val bubbleMetadata = Notification.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIntent(bubbleIntent)
    .setAutoExpandBubble(true)
    .setSuppressNotification(true)
    .build()

Java

Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIntent(bubbleIntent)
        .setAutoExpandBubble(true)
        .setSuppressNotification(true)
        .build();

วงจรการใช้งานเนื้อหาของ Bubble

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

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

เมื่อฟองปรากฏขึ้น

ฟองจะปรากฏในบางกรณีเท่านั้นเพื่อลดการหยุดชะงักของผู้ใช้

หากแอปกำหนดเป้าหมายเป็น Android 11 ขึ้นไป การแจ้งเตือนจะไม่ ปรากฏเป็นบับเบิลเว้นแต่จะเป็นไปตามข้อกำหนดของ การสนทนา หากแอปกำหนดเป้าหมายเป็น Android 10 หรือต่ำกว่า การแจ้งเตือนจะปรากฏเป็นฟองก็ต่อเมื่อเป็นไปตามเงื่อนไขต่อไปนี้อย่างน้อย 1 ข้อ

  • การแจ้งเตือนใช้ MessagingStyle และมี Person เพิ่ม
  • การแจ้งเตือนนี้มาจากการโทรไปยัง Service.startForeground มี category ของ CATEGORY_CALL และ มี Person เพิ่ม
  • แอปทำงานอยู่เบื้องหน้าเมื่อมีการส่งการแจ้งเตือน

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

เปิดกิจกรรมจากบับเบิล

เมื่อบับเบิลเปิดกิจกรรมใหม่ กิจกรรมใหม่จะเปิด ภายในงานเดียวกันและหน้าต่างบับเบิลเดียวกัน หรือในงานใหม่ แบบเต็มหน้าจอ โดยจะยุบบับเบิลที่เปิดกิจกรรมนั้น

วิธีเปิดกิจกรรมใหม่ในงานเดียวกับบับเบิล 1. ใช้บริบทกิจกรรมเมื่อเปิดใช้ Intent activity.startActivity(intent) และ 1. อย่าตั้งค่าสถานะ FLAG_ACTIVITY_NEW_TASK ใน Intent

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

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

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

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

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

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

แอปตัวอย่าง

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