บับเบิลช่วยให้ผู้ใช้ดูและเข้าร่วมการสนทนาได้ง่ายขึ้น
บับเบิลจะอยู่ในระบบการแจ้งเตือน โดยจะลอยอยู่เหนือเนื้อหาของแอปอื่นๆ และติดตามผู้ใช้ไปทุกที่ ผู้ใช้สามารถขยายบับเบิลเพื่อดู และโต้ตอบกับเนื้อหาของแอป รวมถึงยุบบับเบิลเมื่อไม่ได้ ใช้งาน
เมื่ออุปกรณ์ล็อกอยู่หรือเปิดใช้จอแสดงผลที่เปิดอยู่เสมอ บับเบิลจะปรากฏเป็นการแจ้งเตือนตามปกติ
บับเบิลเป็นฟีเจอร์แบบเลือกไม่ใช้ เมื่อแอปแสดงบับเบิลแรก กล่องโต้ตอบขอสิทธิ์จะมี 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"
โดยอัตโนมัติ
หากต้องการส่งบับเบิล ให้ทำตามขั้นตอนต่อไปนี้
- สร้างการแจ้งเตือนตามปกติ
- โทรหา
BubbleMetadata.Builder(PendingIntent, Icon)
หรือBubbleMetadata.Builder(String)
เพื่อสร้างออบเจ็กต์BubbleMetadata
- ใช้
setBubbleMetadata()
เพื่อเพิ่มข้อมูลเมตาลงในการแจ้งเตือน - หากกำหนดเป้าหมายเป็น Android 11 ขึ้นไป ให้ตรวจสอบว่าข้อมูลเมตาของบับเบิล หรือการอ้างอิงการแจ้งเตือนอ้างอิงถึงทางลัดการแชร์
- แก้ไขแอปไม่ให้ยกเลิกการแจ้งเตือนที่ปรากฏเป็นบับเบิล
หากต้องการตรวจสอบว่ากิจกรรมการแจ้งเตือนเปิดเป็นบับเบิลหรือไม่ ให้เรียกใช้
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 เป็นแอปการสนทนาที่ใช้บับเบิล แอปนี้ใช้แชทบอทเพื่อวัตถุประสงค์ในการสาธิต ในการใช้งานจริง ให้ใช้บับเบิลสำหรับข้อความจาก มนุษย์