Bong bóng trò chuyện

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đượ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:

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()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:

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:

Ứ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.