Bong bóng trò chuyện (bubbles) giúp người dùng dễ dàng xem và tham gia vào các cuộc trò chuyện.
Bong bóng trò chuyện được tích hợp trong hệ thống Thông báo. Bong bóng trò chuyện nổi ở phía trên cùng nội dung khác của ứng dụng và đi theo người dùng ở mọi nơi họ di chuyển. Bạn có thể mở rộng bong bóng trò chuyện để cho thấy chức năng và thông tin của ứng dụng, đồng thời có thể thu gọn bong bóng trò chuyện khi không sử dụng.
Khi thiết bị bị khoá hoặc màn hình luôn bật đang hoạt động, bong bóng trò chuyện sẽ xuất hiện như thông báo thông thường.
Bong bóng trò chuyện là một tính năng mà bạn có thể chọn không sử dụng. Khi một ứng dụng hiện bong bóng trò chuyện đầu tiên, hộp thoại quyền sẽ xuất hiện với hai lựa chọn:
- Chặn tất cả bong bóng trò chuyện của ứng dụng của bạn – thông báo không bị chặn nhưng chúng sẽ không bao giờ xuất hiện dưới dạng bong bóng trò chuyện
- Chấp nhận tất cả bong bóng trò chuyện của ứng dụng của bạn – tất cả thông báo được gửi bằng
BubbleMetaData
sẽ xuất hiện dưới dạng bong bóng trò chuyện
Bubble API
Bong bóng trò chuyện được tạo qua Notification API, vì vậy, bạn có thể gửi thông báo như bình thường. Nếu muốn thông báo của mình xuất hiện dưới dạng bong bóng trò chuyện, bạn cần đính kèm thêm một số dữ liệu vào bong bóng trò chuyện.
Chế độ xem mở rộng của bong bóng trò chuyện được tạo từ một hoạt động (activity) mà bạn chọn. Hoạt động cần được định cấu hình để hiển thị chính xác dưới dạng bong bóng trò chuyện. Hoạt động phải có thể đổi kích thước và được nhúng. Nếu không đáp ứng một trong những yêu cầu này, hoạt động sẽ xuất hiện dưới dạng thông báo.
Đoạn mã sau minh hoạ cách triển khai một bong bóng trò chuyện đơn giản:
<activity
android:name=".bubbles.BubbleActivity"
android:theme="@style/AppTheme.NoActionBar"
android:label="@string/title_activity_bubble"
android:allowEmbedded="true"
android:resizeableActivity="true"
/>
Nếu ứng dụng của cho thấy nhiều bong bóng trò chuyện cùng loại (chẳng hạn như các cuộc trò chuyện với nhiều người liên hệ) thì hoạt động đó phải khởi chạy được nhiều thực thể. Trên thiết bị chạy Android 10, các thông báo sẽ không xuất hiện dưới dạng bong bóng trò chuyện, trừ phi bạn đặt documentLaunchMode
thành "always"
một cách rõ ràng. Kể từ Android 11, bạn không cần phải đặt giá trị này một cách rõ ràng vì hệ thống sẽ tự động đặt documentLaunchMode
của tất cả cuộc trò chuyện thành "always"
.
Để gửi bong bóng trò chuyện, hãy làm theo các bước sau:
- Tạo thông báo như bạn thường làm.
- Gọi
BubbleMetadata.Builder(PendingIntent, Icon)
hoặcBubbleMetadata.Builder(String)
để tạo đối tượng BubbleMetadata. - Sử dụng
setBubbleMetadata()
để thêm siêu dữ liệu vào thông báo. - Nếu bạn nhắm đến Android 11 trở lên, siêu dữ liệu hoặc thông báo dạng bong bóng trò chuyện phải tham chiếu đến một lối tắt chia sẻ.
Kotlin
// Create 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 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 bubble metadata val bubbleData = Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build() // Create notification, referencing the sharing shortcut val builder = Notification.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
Java
// Create 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 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 bubble metadata Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build(); // Create notification, referencing the sharing shortcut Notification.Builder builder = new Notification.Builder(mContext, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner);
Nếu ứng dụng của bạn chạy ở nền trước khi bong bóng trò chuyện được gửi, thì tầm quan trọng sẽ bị bỏ qua và bong bóng trò chuyện của bạn sẽ luôn xuất hiện (trừ phi người dùng đã chặn bong bóng trò chuyện hoặc thông báo của ứng dụng của bạn).
Mở rộng bong bóng trò chuyện
Bạn có thể định cấu hình bong bóng trò chuyện để tự động hiển thị ở trạng thái mở rộng. Bạn chỉ nên sử dụng chức năng này nếu người dùng thực hiện một hành động sẽ dẫn đến bong bóng trò chuyện, chẳng hạn như nhấn vào nút để bắt đầu một cuộc trò chuyện mới. Trong trường hợp này, bạn cũng nên ngăn chặn thông báo ban đầu được gửi khi bong bóng trò chuyện được tạo.
Sau đây là các phương thức mà bạn có thể dùng để đặt cờ cho phép các hành vi sau:
setAutoExpandBubble()
và
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();
Vòng đời của nội dung bong bóng trò chuyện
Khi một bong bóng trò chuyện mở rộng, hoạt động nội dung sẽ trải qua vòng đời xử lý thông thường, dẫn đến việc ứng dụng trở thành một quy trình nền trước (nếu chưa thực hiện).
Khi bong bóng trò chuyện được thu gọn hoặc đóng, hoạt động sẽ bị huỷ. Việc này có thể khiến quá trình này được lưu vào bộ nhớ đệm và sau đó bị xoá, tuỳ thuộc vào việc ứng dụng đó có chạy thành phần nào khác trên nền trước hay không.
Khi bong bóng trò chuyện xuất hiện
Để giảm số lần gián đoạn cho người dùng, bong bóng trò chuyện chỉ xuất hiện trong một số trường hợp nhất định.
Nếu một ứng dụng nhắm đến Android 11 trở lên, thì thông báo sẽ không xuất hiện dưới dạng bong bóng trò chuyện, trừ phi ứng dụng đó đáp ứng các yêu cầu về cuộc trò chuyện. Nếu một ứng dụng nhắm đến Android 10, thông báo sẽ chỉ xuất hiện dưới dạng bong bóng trò chuyện nếu ít nhất một điều kiện sau đây được đáp ứng:
- Thông báo sử dụng MessagingStyle và đã thêm một Person.
- Thông báo xuất phát từ một cuộc gọi tới Service.startForeground, có một danh mục CATEGORY_CALL và đã thêm một Person.
- Ứng dụng chạy ở nền trước khi thông báo được gửi.
Nếu không có điều kiện nào nêu trên được đáp ứng, thì thông báo sẽ xuất hiện thay vì một bong bóng trò chuyện.
Các phương pháp hay nhất
- Bong bóng trò chuyện chiếm không gian màn hình và che nội dung của ứng dụng khác. Bạn chỉ nên gửi thông báo dưới dạng bong bóng trò chuyện nếu loại thông báo đó quan trọng, chẳng hạn như quá trình liên lạc đang diễn ra hoặc nếu người dùng đã yêu cầu rõ ràng một bong bóng trò chuyện cho một số nội dung.
- Lưu ý rằng người dùng có thể tắt bong bóng trò chuyện. Trong trường hợp đó, thông báo trong bong bóng trò chuyện sẽ xuất hiện dưới dạng thông báo thông thường. Bạn phải luôn đảm bảo rằng thông báo dạng bong bóng trò chuyện cũng hoạt động như một thông báo thông thường.
- Các quá trình được khởi chạy trong một bong bóng trò chuyện (chẳng hạn như các hoạt động và hộp thoại) sẽ xuất hiện bên trong vùng chứa bong bóng trò chuyện đó. Tức là bong bóng trò chuyện có thể có một ngăn xếp thao tác (task stack). Mọi thứ có thể trở nên phức tạp nếu có nhiều chức năng hoặc thành phần điều hướng trong bong bóng trò chuyện. Bạn nên dùng chức năng cụ thể và nhẹ nhất có thể.
- Hãy nhớ gọi super.onBackpressed khi ghi đè onBackpressed trong hoạt động Bubble, nếu không bong bóng trò chuyện có thể không hoạt động chính xác.
- Khi một bong bóng trò chuyện đã thu gọn nhận được một thông báo mới cập nhật, bong bóng trò chuyện đó sẽ cho thấy một biểu tượng huy hiệu để chỉ báo một tin nhắn chưa đọc. Khi người dùng mở tin nhắn trong ứng dụng liên kết, hãy làm theo các bước sau:
- Cập nhật
BubbleMetadata
để loại bỏ thông báo. GọiBubbleMetadata.Builder.setSupressNotification()
. Thao tác này sẽ xoá biểu tượng huy hiệu để cho biết người dùng đã thực hiện hành động đối với tin nhắn. - Đặt
Notification.Builder.setOnlyAlertOnce()
thành đúng (true) để ngăn chặn âm thanh hoặc chế độ rung đi kèm với nội dung cập nhậtBubbleMetadata
.
- Cập nhật
Ứng dụng mẫu
Ứng dụng mẫu People là một ứng dụng trò chuyện đơn giản sử dụng bong bóng trò chuyện. Cho mục đích minh hoạ, ứng dụng này sử dụng bot trò chuyện. Trong ứng dụng thực tế, bong bóng trò chuyện chỉ được sử dụng cho tin nhắn của con người chứ không phải của bot.