Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Balon

Balon memungkinkan pengguna melakukan banyak tugas dari mana saja di perangkat mereka dengan mudah. Balon didesain sebagai alternatif untuk menggunakan SYSTEM_ALERT_WINDOW.

Balon terintegrasi ke dalam sistem Notifikasi. Fitur tersebut mengambang di atas konten aplikasi lain dan mengikuti pengguna ke mana pun mereka menavigasi. Balon dapat diperluas untuk menampilkan fungsionalitas dan informasi aplikasi, serta dapat diciutkan saat tidak digunakan.

Saat perangkat terkunci atau mode layar always-on aktif, balon akan ditampilkan seperti notifikasi pada umumnya.

Balon adalah fitur yang dapat dipilih untuk tidak digunakan. Saat aplikasi menampilkan balon untuk pertama kalinya, dialog izin akan muncul dan menawarkan dua pilihan:

  • Blokir semua balon dari aplikasi - notifikasi tidak diblokir, tetapi tidak akan ditampilkan sebagai balon
  • Izinkan semua balon dari aplikasi - semua notifikasi yang dikirim dengan BubbleMetaData akan muncul sebagai balon

Bubble API

Balon dibuat melalui Notification API, dan notifikasi dikirim seperti biasa. Jika Anda ingin menampilkan notifikasi sebagai balon, ada beberapa data tambahan yang perlu dilampirkan.

Tampilan balon yang diperluas dibuat dari aktivitas yang Anda pilih. Aktivitas tersebut perlu dikonfigurasi agar ditampilkan dengan baik sebagai balon. Aktivitas harus dapat diubah ukurannya, disematkan, dan selalu diluncurkan dalam mode UI dokumen. Jika tidak memenuhi persyaratan tersebut, balon akan ditampilkan sebagai notifikasi.

Kode berikut menunjukkan cara mengimplementasikan balon sederhana:

<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:documentLaunchMode="always"
  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. Tetapkan documentLaunchMode ke "always" (selalu).

Untuk mengirim balon, ikuti langkah-langkah berikut:

Kotlin

// Create bubble intent
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* flags */)

// Create bubble metadata
val bubbleData = Notification.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIcon(Icon.createWithResource(context, R.drawable.icon))
    .setIntent(bubbleIntent)
    .build()

// Create notification
val chatBot = Person.Builder()
    .setBot(true)
    .setName("BubbleBot")
    .setImportant(true)
    .build()

val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setBubbleMetadata(bubbleData)
    .addPerson(chatBot)

Java

// Create bubble intent
Intent target = new Intent(mContext, BubbleActivity.class);
PendingIntent bubbleIntent =
    PendingIntent.getActivity(mContext, 0, target, 0 /* flags */);

// Create bubble metadata
Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIcon(Icon.createWithResource(context, R.drawable.icon))
        .setIntent(bubbleIntent)
        .build();

// Create notification
Person chatBot = new Person.Builder()
        .setBot(true)
        .setName("BubbleBot")
        .setImportant(true)
        .build();

Notification.Builder builder =
    new Notification.Builder(mContext, CHANNEL_ID)
        .setContentIntent(contentIntent)
        .setSmallIcon(smallIcon)
        .setBubbleMetadata(bubbleData)
        .addPerson(chatBot);

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

Membuat balon yang diperluas

Anda dapat mengonfigurasi balon agar otomatis ditampilkan dalam keadaan diperluas. Sebaiknya gunakan fungsionalitas ini hanya jika pengguna melakukan tindakan yang akan menghasilkan balon, seperti menge-tap 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().

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 proses 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 mungkin menyebabkan proses di-cache, lalu dihentikan, tergantung apakah aplikasi memiliki komponen latar depan lainnya yang sedang berjalan atau tidak.

Waktu balon muncul

Untuk mengurangi jumlah gangguan bagi pengguna, balon hanya akan muncul jika satu atau beberapa ketentuan berikut terpenuhi:

Jika tidak ada ketentuan yang terpenuhi, hanya notifikasi yang akan ditampilkan.

Praktik terbaik

  • Balon menempati ruang layar dan menutup konten aplikasi lainnya. Sebaiknya Anda hanya mengirim notifikasi sebagai balon jika sifatnya cukup penting, seperti komunikasi berkelanjutan, atau jika pengguna secara eksplisit meminta balon untuk konten tertentu.
  • Perhatikan bahwa balon dapat dinonaktifkan oleh pengguna. Dalam hal ini, notifikasi balon akan ditampilkan sebagai notifikasi normal. Anda harus selalu memastikan notifikasi balon Anda juga berfungsi sebagai notifikasi normal.
  • Proses yang diluncurkan dari balon (seperti aktivitas dan dialog) akan muncul di dalam penampung balon. Ini berarti balon dapat memiliki tumpukan tugas. Prosesnya dapat menjadi rumit jika terdapat banyak fungsionalitas atau navigasi dalam balon Anda. Sebaiknya Anda terus mempertahankan fungsionalitas ini sespesifik dan seringan mungkin.