Sử dụng bong bóng để cho phép người dùng tham gia vào các cuộc trò chuyện

Bong bóng trò chuyện giúp người dùng xem và tham gia cuộc trò chuyện dễ dàng hơn.

Hình 1. Một bong bóng trò chuyện.

Bong bóng trò chuyện được tích hợp vào hệ thống thông báo. Những bong bóng này nổi phía trên nội dung khác của ứng dụng và đi theo người dùng ở mọi nơi. Người dùng có thể mở rộng bong bóng để hiển thị thông tin và chức năng của ứng dụng. Ngoài ra, họ có thể thu gọn bong bóng 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 dưới dạng thông báo như bình 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ẽ đưa ra 2 lựa chọn:

  • Chặn tất cả bong bóng trò chuyện của ứng dụng. Thông báo không bị chặn nhưng không bao giờ xuất hiện dưới dạng bong bóng trò chuyện.
  • Cho phép tất cả bong bóng trò chuyện từ ứng dụng của bạn. Tất cả các thông báo được gửi bằng BubbleMetaData sẽ xuất hiện dưới dạng bong bóng.

API bong bóng

Bong bóng trò chuyện được tạo thông qua API thông báo, vì vậy, hãy gửi thông báo của bạn như bình thường. Nếu bạn muốn thông báo của mình hiển thị dưới dạng bong bóng trò chuyện, hãy đính kèm thêm 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. Định cấu hình hoạt động để hiển thị đúng cách 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 hai yêu cầu này, thì trang tổng quan 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 bạn hiện nhiều bong bóng trò chuyện cùng loại, chẳng hạn như nhiều 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 các thiết bị chạy Android 10 trở xuống, 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 đặt giá trị này một cách rõ ràng vì hệ thống sẽ tự động đặt documentLaunchMode của mọi 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:

  1. Tạo một thông báo như bình thường.
  2. Gọi BubbleMetadata.Builder(PendingIntent, Icon) hoặc BubbleMetadata.Builder(String) để tạo đối tượng BubbleMetadata.
  3. Sử dụng setBubbleMetadata() để thêm siêu dữ liệu vào thông báo.
  4. Nếu bạn nhắm mục tiêu đến Android 11 trở lên, hãy đảm bảo siêu dữ liệu bong bóng hoặc thông báo tham chiếu đến lối tắt chia sẻ.

Các bước này được thể hiện trong ví dụ sau đây:

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);

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 luôn hiển thị, trừ khi người dùng chặn bong bóng trò chuyện hoặc thông báo từ ứng dụng của bạn.

Tạo bong bóng trò chuyện mở rộng

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 dẫn đến một 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 loại bỏ thông báo ban đầu được gửi khi tạo bong bóng trò chuyện.

Bạn có thể sử dụng các phương thức để đặt cờ cho phép các hành vi này: setAutoExpandBubble()setSuppressNotification().

Ví dụ sau đây cho biết cách định cấu hình bong bóng trò chuyện để tự động hiển thị ở trạng thái mở rộng:

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 bong bóng trò chuyện được mở rộng, hoạt động nội dung sẽ trải qua vòng đời quy trình thông thường, dẫn đến việc ứng dụng trở thành quy trình trên nền trước (nếu chưa làm như vậy).

Khi bong bóng được thu gọn hoặc đóng, hoạt động sẽ bị huỷ. Điều này có thể dẫn đến việc quá trình này được lưu vào bộ nhớ đệm và sau đó bị dừng, tuỳ thuộc vào việc ứng dụng có các thành phần khác trên nền trước đang chạy hay không.

Khi bong bóng trò chuyện xuất hiện

Để giảm tình trạng 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 trở xuống, thì thông báo chỉ xuất hiện dưới dạng bong bóng trò chuyện nếu đáp ứng một hoặc nhiều điều kiện sau:

Nếu không có điều kiện nào trong số này được đáp ứng, thì thông báo sẽ xuất hiện thay vì bong bóng trò chuyện.

Các phương pháp hay nhất

  • Chỉ gửi thông báo dưới dạng bong bóng trò chuyện nếu thông báo đó quan trọng, chẳng hạn như khi thông báo này nằm trong quá trình giao tiếp đ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 nội dung. Bong bóng trò chuyện sử dụng không gian màn hình và che khuất nội dung ứng dụng khác.
  • Đảm bảo thông báo bong bóng của bạn cũng hoạt động như thông báo bình thường. Khi người dùng tắt bong bóng trò chuyện, một thông báo trong bong bóng trò chuyện sẽ hiển thị dưới dạng thông báo thông thường.
  • Giữ chức năng càng cụ thể và gọn nhẹ càng tốt. Các quá trình khởi chạy 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 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 tác vụ. Mọi thứ có thể trở nên phức tạp nếu có nhiều chức năng hoặc chức năng điều hướng trong bong bóng trò chuyện.
  • Gọi super.onBackPressed khi ghi đè onBackPressed trong hoạt động bong bóng trò chuyện. Nếu không, bong bóng của bạn có thể không hoạt động chính xác.

Khi nhận được thông báo cập nhật đã thu gọn, bong bóng trò chuyện sẽ hiển thị một biểu tượng huy hiệu để cho biết 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. Đối với mục đích minh hoạ, ứng dụng này sử dụng bot trò chuyện. Trong các ứ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.