Sử dụng bong bóng thông báo cho các cuộc trò chuyện

Bong bóng thông báo 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 nổi trên đầu nội dung ứng dụng khác và người dùng có thể mở rộng bong bóng trò chuyện để hiển thị 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 thông thường.

Người dùng bật bong bóng thông báo. Họ có thể làm việc này bằng cách nhấn vào nút bong bóng trò chuyện trên các thông báo hỗ trợ bong bóng trò chuyện. Điều này cho phép cuộc trò chuyện cụ thể đó luôn ở dạng bong bóng trò chuyện. Trong phần cài đặt, người dùng có thể điều chỉnh những cuộc trò chuyện mà họ đã chuyển thành bong bóng trò chuyện hoặc sửa đổi chế độ cài đặt cho ứng dụng tổng thể.

Người dùng có thể làm những việc sau:

  • Chặn tất cả bong bóng thông báo của ứng dụng. Thông báo không bị chặn nhưng sẽ không bao giờ xuất hiện dưới dạng bong bóng trò chuyện.
  • Cho phép các bong bóng thông báo đã chọn của ứng dụng. Thông báo ở dạng bong bóng trò chuyện bằng nút bong bóng trò chuyện là "đã chọn".
  • Cho phép tất cả bong bóng thông báo của ứng dụng. 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 thông báo

Bong bóng thông báo được tạo bằng API thông báo. Nếu bạn muốn thông báo xuất hiện dưới dạng bong bóng trò chuyện, hãy đính kèm dữ liệu bổ sung 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 mà bạn chọn. Định cấu hình hoạt động để xuất hiện đú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 thiếu một trong những yêu cầu này, hệ thống sẽ hiển thị hoạt động đó dưới dạng thông báo.

Đoạn 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 các liên hệ khác nhau, thì hoạt động 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 không xuất hiện dưới dạng bong bóng trò chuyện, trừ phi bạn đặt rõ ràng documentLaunchMode thành "always". Kể từ Android 11, bạn không cần đặt rõ ràng giá trị này, 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 thông báo, hãy làm theo các bước sau:

  1. Tạo 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 đến Android 11 (cấp độ API 30) 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. Việc huỷ thông báo sẽ xoá bong bóng trò chuyện khỏi màn hình. Việc mở bong bóng trò chuyện sẽ tự động ẩn thông báo được liên kết với bong bóng trò chuyện đó.

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

// Create a bubble intent.
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent =
    PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* 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 =
    ShortcutInfoCompat.Builder(context, shortcutId)
        .setCategories(setOf(category))
        .setIntent(Intent(Intent.ACTION_DEFAULT))
        .setLongLived(true)
        .setShortLabel("Chat partner name")
        .build()
// Publish the shortcut, otherwise the bubble metadata will not apply.
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

// Create a bubble metadata.
val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent,
    IconCompat.createWithResource(context, R.drawable.ic_logo))
    .setDesiredHeight(600)
    .build()

// Create a notification, referencing the sharing shortcut.
val builder = NotificationCompat.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(R.drawable.chat)
    .setBubbleMetadata(bubbleData)
    .setShortcutId(shortcutId)
    .addPerson(chatPartner)

Nếu ứng dụng của bạn chạy ở nền trước khi gửi bong bóng trò chuyện, thì mức độ quan trọng sẽ bị bỏ qua và bong bóng trò chuyện của bạn 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.

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 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 ẩn 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:

val bubbleMetadata = NotificationCompat.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ý, 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 bị thu gọn hoặc bị đó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 thiểu 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 (cấp độ API 30) 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 thông báo đó đá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 (cấp độ API 29) trở xuống, thì thông báo sẽ 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 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 khởi chạy ý định, activity.startActivity(intent), và 1. Khô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.

Xin 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 được 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à về khả năng đ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 đó là một phần của 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 phủ nội dung ứ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ư 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ẽ xuất hiện dưới dạng thông báo thông thường.
  • Sử dụng thành phần kết hợp BackHandler và liên kết tham số enabled của thành phần đó với trạng thái giao diện người dùng để thành phần đó chỉ chặn các lần nhấn nút quay lại khi cần. Sau khi trình xử lý tự tắt, bong bóng trò chuyện sẽ thu gọn.

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 được liên kết, hãy làm theo các bước sau:

Ứng dụng mẫu

Ứng dụng mẫu SociaLite là một ứng dụng trò chuyện sử dụng bong bóng trò chuyện. Cho mục đích minh hoạ, ứng dụng này sử dụng chatbot. Trong các ứ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.