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. Quảng cáo này nổi trên nội dung ứng dụng khác và đi theo người dùng ở bất cứ đâu họ đến. Người dùng có thể mở rộng bong bóng để xem 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 dùng đến.

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ẽ cung cấp 2 lựa chọn:

  • Chặn tất cả bong bóng trò chuyện khỏi ứng dụng của bạn. 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ả 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 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 thông báo đó.

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 có một trong hai yêu cầu này, thì URL đó sẽ xuất hiện dưới dạng thông báo.

Mã sau đây minh hoạ cách triển khai 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 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 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 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 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 từ ứng dụng của bạn.

Tạo bong bóng 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 dẫn đến bong bóng trò chuyện, chẳng hạn như nhấn vào 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 chặn thông báo ban đầu được gửi khi một bong bóng trò chuyện được tạo.

Sau đây là các phương thức bạn có thể sử dụng để đặ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 một 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 đượ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 một quy trình trên 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ỏ. Đ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 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 đáp ứng điều kiện nào trong số này, thì thông báo sẽ xuất hiện thay vì bong bóng trò chuyện.

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

Khi một bong bóng khởi chạy một hoạt động mới, thì hoạt động mới đó sẽ chạy trong cùng một tác vụ và cùng một cửa sổ tạo 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 đã khởi chạy hoạt động đó.

Cách chạy một hoạt động mới trong cùng tác vụ với bong bóng: 1. 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 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 khởi 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à xung quanh 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 dạng bong bóng trò chuyện sẽ hiển thị 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 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ở thông báo 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. Ứng dụng này sử dụng bot trò chuyện nhằm mục đích minh hoạ. Trong các ứng dụng thực tế, sử dụng bong bóng cho tin nhắn của con người.