Menggunakan balon agar pengguna dapat berpartisipasi dalam percakapan

Balon memudahkan pengguna untuk melihat dan berpartisipasi dalam percakapan.

Gambar 1. Balon chat.

Balon tertanam dalam sistem notifikasi. Balon mengambang di atas konten aplikasi lain dan mengikuti pengguna ke mana pun mereka pergi. Pengguna dapat meluaskan balon untuk menampilkan fungsi dan informasi aplikasi, serta dapat menciutkannya saat tidak digunakan.

Saat perangkat terkunci, atau layar always-on aktif, balon akan muncul seperti notifikasi biasanya.

Balon adalah fitur yang dapat dipilih untuk tidak digunakan. Saat aplikasi menampilkan balon pertamanya, dialog izin menawarkan dua pilihan:

  • Blokir semua balon dari aplikasi. Notifikasi tidak diblokir, tetapi tidak pernah muncul sebagai balon.
  • Izinkan semua balon dari aplikasi. Semua notifikasi yang dikirim dengan BubbleMetaData muncul sebagai balon.

API balon

Balon dibuat melalui API notifikasi, jadi kirim notifikasi Anda seperti biasa. Jika Anda ingin notifikasi ditampilkan sebagai balon, lampirkan data tambahan ke notifikasi tersebut.

Tampilan balon yang diperluas dibuat dari aktivitas yang Anda pilih. Mengonfigurasi aktivitas agar ditampilkan dengan benar sebagai balon. Aktivitas harus dapat diubah ukurannya dan disematkan. Jika tidak memiliki salah satu persyaratan ini, aplikasi akan ditampilkan sebagai notifikasi.

Kode berikut menunjukkan cara menerapkan balon sederhana:

<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:resizeableActivity="true"
/>

Jika aplikasi Anda menampilkan beberapa balon dengan jenis yang sama, seperti beberapa percakapan chat dengan kontak berbeda, aktivitas tersebut harus dapat meluncurkan beberapa instance. Pada perangkat yang menjalankan Android 10 dan yang lebih lama, notifikasi tidak akan ditampilkan sebagai balon kecuali jika Anda secara eksplisit menyetel documentLaunchMode ke "always". Mulai Android 11, Anda tidak perlu menetapkan nilai ini secara eksplisit karena sistem akan otomatis menetapkan semua documentLaunchMode percakapan ke "always".

Untuk mengirim balon, ikuti langkah-langkah berikut:

  1. Buat notifikasi seperti biasa.
  2. Panggil BubbleMetadata.Builder(PendingIntent, Icon) atau BubbleMetadata.Builder(String) untuk membuat objek BubbleMetadata.
  3. Gunakan setBubbleMetadata() untuk menambahkan metadata ke notifikasi.
  4. Jika menargetkan Android 11 atau yang lebih tinggi, pastikan metadata atau notifikasi balon merujuk ke pintasan berbagi.

Langkah-langkah ini ditampilkan dalam contoh berikut.

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

Jika aplikasi berada di latar depan saat balon dikirim, tingkat kepentingan akan diabaikan dan balon akan selalu ditampilkan, kecuali jika pengguna memblokir balon atau notifikasi dari aplikasi Anda.

Membuat balon yang diperluas

Anda dapat mengonfigurasi balon agar otomatis ditampilkan dalam keadaan diperluas. Sebaiknya gunakan fungsi ini hanya jika pengguna melakukan tindakan yang menghasilkan balon, seperti mengetuk tombol untuk memulai chat baru. Dalam hal ini, sebaiknya sembunyikan notifikasi awal yang dikirim saat balon dibuat.

Ada beberapa metode yang dapat Anda gunakan untuk menetapkan flag yang memungkinkan perilaku ini: setAutoExpandBubble() dan setSuppressNotification().

Contoh berikut menunjukkan cara mengonfigurasi balon agar otomatis ditampilkan dalam status diluaskan:

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

Siklus konten balon

Saat balon diperluas, aktivitas konten melewati siklus proses normal, sehingga menghasilkan aplikasi menjadi proses latar depan, jika belum dilakukan.

Jika balon diciutkan atau ditutup, aktivitas akan dihancurkan. Hal ini dapat menyebabkan proses di-cache dan kemudian dihentikan, bergantung pada apakah aplikasi memiliki komponen latar depan lainnya yang berjalan.

Waktu balon muncul

Untuk mengurangi gangguan bagi pengguna, balon hanya muncul dalam keadaan tertentu.

Jika aplikasi menargetkan Android 11 atau yang lebih baru, notifikasi tidak akan muncul sebagai balon kecuali jika memenuhi persyaratan percakapan. Jika aplikasi menargetkan Android 10 atau yang lebih rendah, notifikasi akan muncul sebagai balon hanya jika satu atau beberapa kondisi berikut terpenuhi:

Jika tidak satu pun dari kondisi tersebut terpenuhi, notifikasi akan ditampilkan sebagai ganti balon.

Praktik terbaik

  • Kirim notifikasi sebagai balon hanya jika penting, seperti saat notifikasi merupakan bagian dari komunikasi berkelanjutan atau jika pengguna secara eksplisit meminta balon untuk konten. Balon menggunakan ruang layar dan menutupi konten aplikasi lainnya.
  • Pastikan notifikasi balon Anda juga berfungsi sebagai notifikasi normal. Saat pengguna menonaktifkan balon, notifikasi balon akan ditampilkan sebagai notifikasi normal.
  • Jaga agar fungsi sespesifik dan seringan mungkin. Proses yang diluncurkan dari balon, seperti aktivitas dan dialog, muncul dalam penampung balon. Ini berarti bubble dapat memiliki tumpukan tugas. Proses akan menjadi rumit jika ada banyak fungsionalitas atau navigasi dalam balon Anda.
  • Panggil super.onBackPressed saat mengganti onBackPressed dalam aktivitas balon. Jika tidak, balon Anda mungkin tidak berfungsi dengan benar.

Saat balon yang diciutkan menerima pesan yang diperbarui, balon akan menampilkan ikon badge untuk menunjukkan pesan yang belum dibaca. Saat pengguna membuka pesan di aplikasi terkait, ikuti langkah-langkah berikut:

Aplikasi contoh

Aplikasi contoh Orang adalah aplikasi percakapan sederhana yang menggunakan balon. Untuk tujuan demonstrasi, aplikasi ini menggunakan chatbot. Dalam aplikasi dunia nyata, balon hanya boleh digunakan untuk pesan oleh manusia, bukan bot.