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

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

รูปที่ 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 FLAG_ACTIVITY_NEW_TASK ใน Intent

มิฉะนั้น กิจกรรมใหม่จะเริ่มต้นในงานใหม่และลูกโป่งจะถูกยุบ

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

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

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

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

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

แอปตัวอย่าง

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