Balon notifikasi memudahkan pengguna melihat dan berpartisipasi dalam percakapan.
Balon mengambang di atas konten aplikasi lain dan 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 biasanya.
Balon notifikasi diaktifkan oleh pengguna. Mereka dapat melakukannya dengan mengetuk tombol balon pada notifikasi yang mendukung balon. Tindakan ini memungkinkan chat tertentu selalu muncul sebagai balon. Di setelan, pengguna dapat menyesuaikan chat mana yang telah mereka jadikan balon atau mengubah setelan untuk aplikasi secara keseluruhan.
Pengguna dapat melakukan hal berikut:
- Memblokir semua balon notifikasi dari aplikasi Anda. Notifikasi tidak diblokir, tetapi tidak pernah muncul sebagai balon.
- Izinkan balon notifikasi yang dipilih dari aplikasi Anda. Notifikasi yang ditampilkan dalam balon menggunakan tombol balon akan "dipilih".
- Mengizinkan semua balon notifikasi dari aplikasi Anda. Semua notifikasi yang dikirim dengan
BubbleMetadataakan muncul sebagai balon.
API Balon Notifikasi
Balon notifikasi dibuat menggunakan API notifikasi. Jika Anda ingin notifikasi muncul sebagai balon, lampirkan data tambahan ke notifikasi tersebut.
Tampilan balon yang diperluas dibuat dari aktivitas yang Anda pilih. Konfigurasikan aktivitas agar muncul dengan benar sebagai balon. Aktivitas harus dapat diubah ukurannya dan disematkan. Jika tidak memenuhi salah satu persyaratan ini, sistem akan menampilkannya sebagai notifikasi.
Kode berikut menunjukkan cara mengimplementasikan 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 harus dapat meluncurkan
beberapa instance. Pada perangkat yang menjalankan Android 10 dan yang lebih rendah,
notifikasi tidak ditampilkan sebagai balon kecuali jika Anda secara eksplisit menetapkan
documentLaunchMode ke
"always". Mulai Android 11, Anda tidak perlu menetapkan nilai ini secara eksplisit, karena sistem otomatis menetapkan documentLaunchMode semua percakapan ke "always".
Untuk mengirim balon notifikasi, 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 (level API 30) atau yang lebih tinggi, pastikan metadata balon atau notifikasi mereferensikan pintasan berbagi.
- Ubah aplikasi Anda agar tidak membatalkan notifikasi yang muncul sebagai balon. Membatalkan notifikasi akan menghapus balon dari layar. Membuka balon akan otomatis menyembunyikan notifikasi yang terkait dengannya.
Langkah-langkah ini ditampilkan dalam contoh berikut.
// 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)
Jika aplikasi Anda berada di latar depan saat balon dikirim, tingkat kepentingan akan diabaikan dan balon Anda 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, notifikasi awal yang dikirim saat balon dibuat juga dapat disembunyikan.
Ada metode yang dapat Anda gunakan untuk menetapkan flag yang mengaktifkan perilaku ini:
setAutoExpandBubble()
dan
setSuppressNotification().
Contoh berikut menunjukkan cara mengonfigurasi balon agar otomatis ditampilkan dalam status diperluas:
val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
Siklus konten balon
Saat balon diperluas, aktivitas konten akan melalui siklus proses proses normal, sehingga aplikasi menjadi proses latar depan, jika belum.
Saat 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 lain yang berjalan.
Waktu balon muncul
Untuk mengurangi gangguan bagi pengguna, balon hanya muncul dalam keadaan tertentu.
Jika aplikasi menargetkan Android 11 (level API 30) atau yang lebih tinggi, notifikasi tidak akan muncul sebagai balon kecuali jika memenuhi persyaratan percakapan. Jika aplikasi menargetkan Android 10 (level API 29) atau yang lebih rendah, notifikasi akan muncul sebagai balon hanya jika satu atau beberapa kondisi berikut terpenuhi:
- Notifikasi menggunakan
MessagingStyledan memilikiPersonyang ditambahkan. - Notifikasi berasal dari panggilan ke
Service.startForeground, memilikicategorydariCATEGORY_CALL, dan memilikiPersonyang ditambahkan. - Aplikasi berada di latar depan saat notifikasi dikirim.
Jika tidak ada kondisi yang terpenuhi, notifikasi akan ditampilkan, bukan 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.
Perlu diingat bahwa balon mewakili percakapan tertentu, sehingga aktivitas yang diluncurkan dalam balon harus terkait dengan percakapan tersebut. Selain itu, meluncurkan aktivitas dalam balon akan meningkatkan tumpukan tugas balon dan berpotensi mempersulit pengalaman pengguna, khususnya seputar navigasi.
Praktik terbaik
- Kirim notifikasi sebagai balon hanya jika penting, seperti saat notifikasi tersebut merupakan bagian dari komunikasi yang sedang berlangsung atau jika pengguna secara eksplisit meminta balon untuk konten. Balon menggunakan ruang layar dan menutupi konten aplikasi lain.
- Pastikan notifikasi balon Anda juga berfungsi sebagai notifikasi normal. Saat pengguna menonaktifkan balon, notifikasi balon akan ditampilkan sebagai notifikasi biasa.
- Gunakan composable
BackHandlerdan kaitkan parameterenabled-nya ke status UI Anda sehingga hanya menangkap penekanan tombol kembali jika diperlukan. Setelah pengendali menonaktifkan dirinya sendiri, balon akan diciutkan.
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
BubbleMetadatauntuk menyembunyikan notifikasi. PanggilBubbleMetadata.Builder.setSuppressNotification(). Tindakan ini akan menghapus ikon badge untuk menunjukkan bahwa pengguna berinteraksi dengan pesan. - Tetapkan
Notification.Builder.setOnlyAlertOnce()ketrueuntuk menyembunyikan suara atau getaran yang menyertai updateBubbleMetadata.
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 yang dikirim oleh manusia.