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 dễ dàng xem và tham gia vào các cuộc trò chuyệ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 bạn khoá thiết bị 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 thường làm.

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 trong ứng dụng của bạn. Thông báo không bị chặn không bao giờ xuất hiện dưới dạng bong bóng.
  • Cho phép tất cả bong bóng trò chuyện của ứng dụng. Tất cả thông báo được gửi bằng BubbleMetaData xuất hiện dưới dạng bong bóng.

Bubble API

Bong bóng trò chuyện được tạo bằng API thông báo nên hãy gửi thông báo dưới dạng 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 thiếu một trong hai yêu cầu này thì nội dung đó sẽ hiển thị 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ư nhiều bong bóng trò chuyện các cuộc trò chuyện với những người liên hệ khác nhau, thì hoạt động này phải có thể khởi chạy 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 vì hệ thống sẽ tự động đặt tất cả cuộc trò chuyện documentLaunchMode 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 ứng dụng của bạn nhắm đến Android 11 trở lên, hãy đảm bảo rằng bong bóng trò chuyện siêu dữ liệu hoặc thông báo tham chiếu đến lối tắt chia sẻ.
  5. Sửa đổi ứng dụng của bạn để 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 kích hoạt dưới dạng bong bóng trò chuyện hay không, hãy gọi Activity#isLaunchedFromBubble(). Việc huỷ thông báo sẽ xoá bong bóng 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. T4 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 kết quả trong bong bóng trò chuyện, chẳng hạn như nhấn vào một nút để bắt đầu 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 thu gọn hoặc đóng bong bóng, hoạt động sẽ bị huỷ bỏ. 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ự 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 mục tiêu đến Android 11 trở lên, thì thông báo sẽ không hiển thị xuất hiện dưới dạng bong bóng trừ phi gặp cuộc trò chuyện . Nếu một ứng dụng nhắm đến Android 10 trở xuống, 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 trong số này được đáp ứng, thông báo sẽ hiển thị thay vì .

Khởi chạy hoạt động từ bong bóng trò chuyện

Khi bong bóng 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 việc cần làm và trong cùng một cửa sổ bong bóng trò chuyện hoặc trong một việc cần làm mới ở chế độ toàn màn hình, thu gọn bong bóng khởi chạy màn hình.

Để khởi chạy một hoạt động mới trong cùng tác vụ với bong bóng, hãy làm như sau: 1. Hãy sử dụng ngữ cảnh hoạt động khi khởi chạy ý định, activity.startActivity(intent) và 1. Không đặt cờ FLAG_ACTIVITY_NEW_TASK cho ý định.

Nếu không, hoạt động mới sẽ bắt đầu trong một việc cần làm mới và bong bóng sẽ đã thu gọn.

Lưu ý rằng bong bóng đạ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 một phần của quá trình giao tiếp đang diễn ra hoặc nếu người dùng rõ ràng yêu cầu bong bóng trò chuyện nội dung. 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.
  • Đả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ủa bạ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 cập nhật, bong bóng trò chuyện đó sẽ hiển thị một huy hiệu để cho biết một thư chưa đọc. Khi người dùng mở thư 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. Nhằm mục đích 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.