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 các cuộc trò chuyện dễ dàng hơn.

Hình 1. 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. 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. Người dùng có thể mở rộng bong bóng trò chuyện để cho thấy và tương tác với nội dung ứ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 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 cấp 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.
  • Cho phép tất cả bong bóng trò chuyện từ ứ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.

API bong bóng

Bong bóng trò chuyện được tạo bằng API thông báo, vì vậy, hãy gửi thông báo như bình thường. Nếu bạn muốn thông báo của mình xuất hiện 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ị 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 đây minh hoạ cách triển khai một bong bóng trò chuyệ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 thị 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 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 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:

  1. Tạo thông báo như bạn thường làm.
  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 đến Android 11 trở lên, hãy đảm bảo siêu dữ liệu hoặc thông báo dạng bong bóng trò chuyện tham chiếu đến một lối tắt chia sẻ.
  5. Sửa đổi ứng dụng để không huỷ các thông báo xuất hiện dưới dạng bong bóng trò chuyện. Để kiểm tra xem hoạt động thông báo có được khởi chạy dưới dạng bong bóng trò chuyện hay không, hãy gọi Activity#isLaunchedFromBubble(). Thao tác huỷ thông báo sẽ xoá bong bóng trò chuyện khỏi màn hình. Thao tác mở bong bóng trò chuyện sẽ tự động ẩn thông báo liên quan đến bong bóng trò chuyện đó.

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

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 tính 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().

Ví dụ sau đây cho thấy 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 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ỷ. Điều này có thể khiến 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 trên nền trước khác đang chạy hay không.

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

Để giảm sự 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 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.

Chạy hoạt động từ bong bóng trò chuyện

Khi một bong bóng trò chuyện khởi chạy một hoạt động mới, hoạt động mới sẽ khởi chạy trong cùng một tác vụ và cùng một cửa sổ bong bóng trò chuyện hoặc trong một tác vụ mới ở chế độ toàn màn hình, thu gọn bong bóng trò chuyện đã khởi chạy hoạt động đó.

Cách khởi chạy một hoạt động mới trong cùng một tác vụ với bong bóng trò chuyện: 1. Sử dụng ngữ cảnh hoạt động khi chạy ý định, activity.startActivity(intent) và 1. Đừng đặt cờ FLAG_ACTIVITY_NEW_TASK trên ý định.

Nếu không, hoạt động mới sẽ bắt đầu trong một tác vụ mới và bong bóng trò chuyện sẽ bị thu gọn.

Lưu ý rằng bong bóng trò chuyện đại diện cho một cuộc trò chuyện cụ thể, vì vậy, các hoạt động khởi chạy trong bong bóng trò chuyện phải liên quan đến cuộc trò chuyện đó. Ngoài ra, việc chạy một hoạt động trong bong bóng trò chuyện sẽ làm tăng ngăn xếp tác vụ của bong bóng trò chuyện và có thể làm phức tạp trải nghiệm người dùng, đặc biệt là về thao tác điều hướng.

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 là một phần của quá trình giao tiếp đang diễn ra hoặc khi người dùng yêu cầu rõ ràng bong bóng cho nội dung. Bong bóng trò chuyện sử dụng không gian màn hình và che phủ nội dung khác của ứng dụng.
  • Đảm bảo 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. Khi người dùng tắt bong bóng trò chuyện, 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.
  • Gọi super.onBackPressed khi ghi đè onBackPressed trong hoạt động bong bóng trò chuyện. 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 sử dụng bong bóng trò chuyện. Để minh hoạ, ứng dụng này sử dụng chatbot. Trong ứng dụng thực tế, hãy sử dụng bong bóng trò chuyện cho tin nhắn của con người.