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

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

รูปที่ 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&quo>t;
  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();

วงจรการใช้งานเนื้อหาในบับเบิล

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

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

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

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

หากแอปกำหนดเป้าหมายเป็น 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 อัปเดต

แอปตัวอย่าง

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