Balon memudahkan pengguna untuk melihat dan berpartisipasi dalam percakapan.
Balon dibangun ke dalam sistem notifikasi. Mereka melayang di atas aplikasi lain dan mengikuti pengguna ke mana pun mereka pergi. Pengguna dapat meluaskan balon untuk membuka berinteraksi dengan konten aplikasi, dan dapat menciutkannya saat tidak menggunakannya.
Saat perangkat dikunci, atau layar always-on aktif, balon muncul sebagai notifikasi.
Balon adalah fitur yang dapat dipilih untuk tidak digunakan. Saat aplikasi menampilkan balon pertamanya, dialog izin menawarkan dua pilihan:
- Memblokir semua balon dari aplikasi. Notifikasi tidak diblokir, tetapi tidak pernah muncul sebagai balon.
- Izinkan semua balon dari aplikasi Anda. Semua notifikasi yang dikirim dengan
BubbleMetaData
muncul sebagai balon.
Bubble API
Balon dibuat menggunakan API notifikasi, jadi kirimkan notifikasi Anda sebagai seperti biasanya. Jika Anda ingin notifikasi ditampilkan sebagai balon, lampirkan data tambahan IP eksternal mana pun yang ditetapkan pada instance tersebut.
Tampilan balon yang diperluas dibuat dari aktivitas yang Anda pilih. Konfigurasi aktivitas agar ditampilkan dengan benar sebagai balon. Aktivitas harus dapat diubah ukurannya dan disematkan. Jika tidak salah satu dari persyaratan ini, 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 chat
percakapan dengan kontak yang berbeda, aktivitas harus dapat diluncurkan
ke beberapa instance. Pada perangkat yang menjalankan Android 10 dan yang lebih lama,
notifikasi tidak ditampilkan sebagai balon kecuali jika Anda menyetelnya secara eksplisit
documentLaunchMode
ke
"always"
. Mulai Android 11, Anda tidak harus secara eksplisit
tetapkan nilai ini, karena sistem otomatis menetapkan semua
documentLaunchMode
hingga "always"
.
Untuk mengirim balon, ikuti langkah-langkah berikut:
- Membuat notifikasi saat Anda biasanya Anda lakukan.
- 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 tinggi, pastikan balon atau notifikasi yang merujuk pada 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 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. Rab menyarankan untuk hanya menggunakan fitur ini jika pengguna melakukan tindakan yang menghasilkan balon, seperti mengetuk tombol untuk memulai percakapan baru. Dalam kasus ini, sebaiknya sembunyikan notifikasi awal ketika gelembung dibuat.
Ada beberapa metode yang dapat Anda gunakan untuk menetapkan tanda yang memungkinkan perilaku berikut:
setAutoExpandBubble()
dan
setSuppressNotification()
.
Contoh berikut menunjukkan cara mengonfigurasi balon agar ditampilkan secara otomatis dalam keadaan 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 proses normal siklus proses, yang menghasilkan aplikasi menjadi proses latar depan, jika belum dilakukan.
Saat balon diciutkan atau ditutup, aktivitas akan dihancurkan. Hal ini mungkin mengakibatkan proses di-cache dan kemudian dibunuh, tergantung pada apakah aplikasi memiliki komponen latar depan lainnya yang berjalan.
Waktu balon muncul
Untuk mengurangi gangguan bagi pengguna, balon hanya muncul di bagian situasi.
Jika aplikasi menargetkan Android 11 atau yang lebih tinggi, notifikasi tidak muncul sebagai balon kecuali jika memenuhi kolom persyaratan. Jika aplikasi menargetkan Android 10 atau yang lebih rendah, notifikasi muncul sebagai balon hanya jika satu atau beberapa kondisi berikut terpenuhi:
- Notifikasi menggunakan
MessagingStyle
dan memilikiPerson
ditambahkan. - Notifikasi berasal dari panggilan ke
Service.startForeground
, memilikicategory
penggunaCATEGORY_CALL
, dan memilikiPerson
yang ditambahkan. - Aplikasi berada di latar depan saat notifikasi dikirim.
Jika tidak satu pun dari kondisi ini yang terpenuhi, notifikasi akan ditampilkan sebagai ganti .
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, menutup gelembung yang meluncurkannya.
Untuk meluncurkan aktivitas baru dalam tugas yang sama dengan balon:
Akun Layanan 1. Gunakan konteks aktivitas saat meluncurkan intent,
activity.startActivity(intent)
, dan
Akun Layanan 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, jadi aktivitas yang diluncurkan di 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
- Mengirim notifikasi sebagai balon hanya jika penting, seperti saat penting bagian dari komunikasi yang sedang berlangsung atau jika pengguna secara eksplisit meminta {i>bubble <i}untuk saat ini. Balon menggunakan ruang layar dan menutupi konten aplikasi lainnya.
- Pastikan notifikasi balon Anda juga berfungsi seperti notifikasi normal. Kapan pengguna menonaktifkan balon, maka notifikasi balon ditampilkan sebagai notifikasi.
- Panggil
super.onBackPressed
saat menggantionBackPressed
dalam balon aktivitas Anda. Jika tidak, balon Anda mungkin tidak akan berperilaku dengan benar.
Saat balon yang diciutkan menerima pesan yang diperbarui, balon tersebut akan menampilkan badge untuk menunjukkan pesan yang belum dibaca. Saat pengguna membuka pesan di 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. - Setel
Notification.Builder.setOnlyAlertOnce()
ketrue
untuk menekan suara atau getaran yang menyertaiBubbleMetadata
memperbarui.
Aplikasi contoh
Tujuan Orang aplikasi contoh adalah aplikasi percakapan yang menggunakan balon. Untuk tujuan demonstrasi, aplikasi ini menggunakan chatbot. Dalam aplikasi dunia nyata, gunakan balon untuk pesan dengan manusia.