Balon memudahkan pengguna untuk melihat dan berpartisipasi dalam percakapan.
Balon terintegrasi dengan sistem notifikasi. Fitur tersebut mengambang di atas konten aplikasi lain dan mengikuti pengguna ke mana pun mereka menavigasi. Pengguna dapat meluaskan balon untuk menampilkan dan berinteraksi dengan konten aplikasi, serta dapat menciutkannya saat tidak menggunakannya.
Saat perangkat terkunci, atau layar always-on aktif, balon akan muncul seperti notifikasi pada umumnya.
Balon adalah fitur yang dapat dipilih untuk tidak digunakan. Saat aplikasi menampilkan balon pertamanya, dialog izin menawarkan dua pilihan:
- Blokir semua balon dari aplikasi Anda. Notifikasi tidak diblokir, tetapi tidak akan ditampilkan sebagai balon.
- Izinkan semua balon dari aplikasi Anda. Semua notifikasi yang dikirim dengan
BubbleMetaData
akan muncul sebagai balon.
Bubble API
Balon dibuat menggunakan notification API, jadi kirim notifikasi 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. Konfigurasikan aktivitas agar ditampilkan dengan benar sebagai balon. Aktivitas harus dapat diubah ukurannya dan disematkan. Jika tidak memiliki salah satu persyaratan ini, balon akan ditampilkan sebagai notifikasi.
Kode berikut menunjukkan cara menerapkan balon:
<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 yang 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 Anda secara eksplisit menetapkan
documentLaunchMode
ke
"always"
. Mulai Android 11, Anda tidak perlu secara eksplisit
menetapkan nilai ini, karena sistem secara otomatis menetapkan semua percakapan'
documentLaunchMode
ke "always"
.
Untuk mengirim balon, ikuti langkah-langkah berikut:
- Buat notifikasi seperti biasa.
- Panggil
BubbleMetadata.Builder(PendingIntent, Icon)
atauBubbleMetadata.Builder(String)
untuk membuat objekBubbleMetadata
. - Gunakan
setBubbleMetadata()
untuk menambahkan metadata ke notifikasi. - Jika menargetkan Android 11 atau yang lebih baru, pastikan metadata atau notifikasi balon mereferensikan pintasan berbagi.
- Ubah aplikasi Anda agar tidak membatalkan notifikasi yang muncul sebagai balon.
Untuk memeriksa apakah aktivitas notifikasi diluncurkan sebagai balon, panggil
Activity#isLaunchedFromBubble()
. Membatalkan notifikasi akan menghapus balon dari layar. Membuka balon akan otomatis menyembunyikan notifikasi yang terkait dengannya.
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 Anda berjalan di latar depan saat balon dikirim, tingkat kepentingan 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 fitur ini hanya jika pengguna melakukan tindakan yang menghasilkan balon, seperti mengetuk tombol untuk memulai chat baru. Dalam hal ini, sebaiknya sembunyikan notifikasi awal saat balon dibuat.
Ada beberapa metode yang dapat Anda gunakan untuk menyetel flag yang memungkinkan perilaku berikut: setAutoExpandBubble()
dan setSuppressNotification()
.
Contoh berikut menunjukkan cara mengonfigurasi balon agar otomatis ditampilkan dalam status diperluas:
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
Jika balon diperluas, aktivitas konten akan melewati siklus proses normal, sehingga aplikasi menjadi proses latar depan, jika belum.
Jika balon diciutkan atau ditutup, aktivitas akan dihapus. Hal ini dapat menyebabkan proses di-cache, lalu dihentikan, bergantung pada apakah aplikasi memiliki komponen latar depan lainnya yang sedang 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:
- Notifikasi menggunakan
MessagingStyle
dan telah menambahkanPerson
. - Notifikasi berasal dari panggilan ke
Service.startForeground
, memilikicategory
dariCATEGORY_CALL
, dan memilikiPerson
yang ditambahkan. - Aplikasi berada di latar depan saat notifikasi dikirim.
Jika tidak satu pun dari kondisi ini terpenuhi, notifikasi akan ditampilkan sebagai ganti balon.
Meluncurkan aktivitas dari balon
Saat balon meluncurkan aktivitas baru, aktivitas baru akan diluncurkan dalam tugas yang sama dan jendela balon yang sama, atau dalam tugas baru dalam layar penuh, yang menciutkan balon yang meluncurkannya.
Untuk meluncurkan aktivitas baru dalam tugas yang sama dengan balon:
1. Gunakan konteks aktivitas saat meluncurkan intent,
activity.startActivity(intent)
, dan
1. Jangan tetapkan flag FLAG_ACTIVITY_NEW_TASK
pada intent.
Jika tidak, aktivitas baru akan dimulai dalam tugas baru dan balon akan diciutkan.
Perhatikan bahwa balon mewakili percakapan tertentu, sehingga aktivitas yang diluncurkan dalam balon harus terkait dengan percakapan tersebut. Selain itu, meluncurkan aktivitas dalam balon akan meningkatkan stack tugas balon dan berpotensi mempersulit pengalaman pengguna, terutama terkait navigasi.
Praktik terbaik
- Kirim notifikasi sebagai balon hanya jika penting, seperti saat merupakan bagian dari komunikasi yang sedang berlangsung atau jika pengguna secara eksplisit meminta balon untuk konten. Balon menggunakan ruang layar dan menutup konten aplikasi lainnya.
- Pastikan notifikasi balon Anda juga berfungsi sebagai notifikasi normal. Saat pengguna menonaktifkan balon, notifikasi balon akan ditampilkan sebagai notifikasi normal.
- Panggil
super.onBackPressed
saat menggantionBackPressed
dalam aktivitas balon. Jika tidak, balon Anda mungkin tidak akan 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:
- Perbarui
BubbleMetadata
untuk menyembunyikan notifikasi. PanggilBubbleMetadata.Builder.setSuppressNotification()
. Tindakan ini akan menghapus ikon badge untuk menunjukkan bahwa pengguna telah berinteraksi dengan pesan. - Tetapkan
Notification.Builder.setOnlyAlertOnce()
ketrue
untuk menonaktifkan suara atau getaran yang menyertai pembaruanBubbleMetadata
.
Aplikasi contoh
Aplikasi contoh SociaLite adalah aplikasi percakapan yang menggunakan balon. Untuk tujuan demonstrasi, aplikasi ini menggunakan chatbot. Dalam aplikasi dunia nyata, gunakan balon untuk pesan oleh manusia.