Notifikasi memberikan informasi singkat dan tepat waktu tentang peristiwa di aplikasi Anda saat sedang tidak digunakan. Dokumen ini menunjukkan cara membuat notifikasi dengan berbagai fitur. Untuk pengantar cara notifikasi muncul di Android, lihat Ringkasan notifikasi. Untuk kode contoh yang menggunakan notifikasi, lihat contoh SociaLite di GitHub.
Kode di halaman ini menggunakan
NotificationCompat
API dari AndroidX Library. API ini memungkinkan Anda menambahkan fitur yang hanya tersedia di versi Android yang lebih baru sambil tetap memberikan kompatibilitas kembali ke Android 9 (level API 28). Namun, beberapa fitur, seperti tindakan balas inline,
mengakibatkan tidak adanya pengoperasian pada versi yang lebih lama.
Menambahkan AndroidX Core Library
Meskipun sebagian besar project yang dibuat dengan Android Studio menyertakan dependensi yang diperlukan untuk menggunakan NotificationCompat
, verifikasi bahwa file build.gradle
level modul Anda menyertakan dependensi berikut:
Groovy
dependencies { implementation "androidx.core:core-ktx:1.16.0" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.16.0") }
Membuat notifikasi dasar
Notifikasi dalam bentuk yang paling mendasar dan ringkas—juga dikenal sebagai bentuk yang diciutkan—menampilkan ikon, judul, dan sejumlah kecil konten teks. Bagian ini menunjukkan cara membuat notifikasi yang dapat diketuk pengguna untuk meluncurkan aktivitas di aplikasi Anda.
Gambar 1. Notifikasi dengan ikon, judul, dan beberapa teks.
Untuk detail selengkapnya tentang setiap bagian dari notifikasi, baca anatomi notifikasi.
Mendeklarasikan izin runtime
Android 13 (API level 33) dan yang lebih tinggi mendukung izin runtime untuk memposting notifikasi yang tidak dikecualikan (termasuk Layanan Latar Depan (FGS)) dari aplikasi.
Izin yang perlu Anda deklarasikan di file manifes aplikasi akan muncul dalam cuplikan kode berikut:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
Untuk mengetahui detail selengkapnya tentang izin runtime, lihat Izin runtime notifikasi.
Menetapkan konten notifikasi
Untuk memulai, tetapkan konten dan saluran notifikasi menggunakan objek
NotificationCompat.Builder
. Contoh berikut menunjukkan cara membuat notifikasi dengan
berikut:
Ikon kecil, yang ditetapkan oleh
setSmallIcon()
. Ini adalah satu-satunya konten yang dapat dilihat pengguna yang diperlukan.Judul, yang ditetapkan oleh
setContentTitle()
.Teks isi, yang ditetapkan oleh
setContentText()
.Prioritas notifikasi, ditetapkan oleh
setPriority()
. Prioritas menentukan seberapa mengganggu notifikasi pada Android 7.1 dan yang lebih lama. Untuk Android 8.0 dan yang lebih baru, tetapkan kepentingan saluran seperti yang ditunjukkan di bagian selanjutnya.
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT);
Konstruktor NotificationCompat.Builder
mengharuskan Anda memberikan ID
saluran. Hal ini diperlukan untuk kompatibilitas dengan Android 8.0 (API level 26) dan yang lebih baru, tetapi diabaikan oleh versi yang lebih lama.
Secara default, konten teks notifikasi dipotong agar pas dalam satu baris. Anda dapat menampilkan informasi tambahan dengan membuat notifikasi yang dapat diluaskan.
Gambar 2. Notifikasi yang dapat diluaskan dalam bentuk diciutkan dan diluaskan.
Jika menginginkan notifikasi lebih panjang, Anda dapat mengaktifkan notifikasi
yang dapat diperluas dengan menambahkan template gaya menggunakan
setStyle()
.
Misalnya, kode berikut akan membuat area teks yang lebih luas:
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Much longer text that cannot fit one line...") .setStyle(NotificationCompat.BigTextStyle() .bigText("Much longer text that cannot fit one line...")) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Much longer text that cannot fit one line...") .setStyle(new NotificationCompat.BigTextStyle() .bigText("Much longer text that cannot fit one line...")) .setPriority(NotificationCompat.PRIORITY_DEFAULT);
Untuk informasi gaya notifikasi besar lain selengkapnya, termasuk cara menambahkan gambar dan kontrol pemutaran media, lihat Membuat notifikasi yang dapat diluaskan.
Membuat saluran dan menetapkan kepentingannya
Sebelum dapat menayangkan notifikasi di Android 8.0 dan yang lebih baru, daftarkan saluran notifikasi aplikasi Anda ke sistem dengan meneruskan instance NotificationChannel
ke createNotificationChannel()
.
Kode berikut diblokir oleh suatu kondisi pada versi
SDK_INT
:
Kotlin
private fun createNotificationChannel() { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is not in the Support Library. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val name = getString(R.string.channel_name) val descriptionText = getString(R.string.channel_description) val importance = NotificationManager.IMPORTANCE_DEFAULT val channel = NotificationChannel(CHANNEL_ID, name, importance).apply { description = descriptionText } // Register the channel with the system. val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) } }
Java
private void createNotificationChannel() { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is not in the Support Library. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence name = getString(R.string.channel_name); String description = getString(R.string.channel_description); int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); channel.setDescription(description); // Register the channel with the system; you can't change the importance // or other notification behaviors after this. NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } }
Karena harus membuat saluran notifikasi sebelum memposting notifikasi apa pun di Android 8.0 dan yang lebih baru, jalankan kode ini segera setelah aplikasi Anda dimulai. Aman untuk memanggilnya berulang kali, karena membuat saluran notifikasi yang ada tidak akan menjalankan operasi apa pun.
Konstruktor NotificationChannel
memerlukan importance
, menggunakan salah satu konstanta dari class NotificationManager
. Parameter
ini menentukan cara menginterupsi pengguna untuk setiap notifikasi yang menjadi milik
saluran ini. Tetapkan priority dengan setPriority()
untuk mendukung Android 7.1
dan yang lebih lama, seperti yang ditunjukkan dalam contoh sebelumnya.
Meskipun Anda harus menetapkan kepentingan atau prioritas notifikasi seperti yang ditunjukkan dalam contoh berikut, sistem tidak menjamin perilaku pemberitahuan yang akan Anda dapatkan. Dalam beberapa kasus, sistem mungkin mengubah tingkat kepentingan berdasarkan faktor lain, dan pengguna selalu dapat menentukan ulang tingkat kepentingan untuk saluran tertentu.
Untuk informasi perbedaan tingkat selengkapnya, baca tingkat kepentingan notifikasi.
Menetapkan tindakan ketuk notifikasi
Setiap notifikasi harus merespons ketukan, biasanya untuk membuka aktivitas dalam
aplikasi Anda yang sesuai dengan notifikasi tersebut. Untuk melakukannya, tentukan intent konten yang ditentukan dengan objek PendingIntent
dan teruskan ke setContentIntent()
.
Cuplikan berikut ini menunjukkan cara membuat intent dasar untuk membuka aktivitas saat pengguna mengetuk notifikasi:
Kotlin
// Create an explicit intent for an Activity in your app. val intent = Intent(this, AlertDetails::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) // Set the intent that fires when the user taps the notification. .setContentIntent(pendingIntent) .setAutoCancel(true)
Java
// Create an explicit intent for an Activity in your app. Intent intent = new Intent(this, AlertDetails.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) // Set the intent that fires when the user taps the notification. .setContentIntent(pendingIntent) .setAutoCancel(true);
Kode ini memanggil
setAutoCancel()
,
yang otomatis menghapus notifikasi saat pengguna mengetuknya.
Flag intent dalam contoh sebelumnya mempertahankan pengalaman navigasi yang diharapkan pengguna setelah pengguna membuka aplikasi Anda menggunakan notifikasi. Anda mungkin ingin menggunakannya, bergantung pada jenis aktivitas yang Anda mulai, yang dapat berupa salah satu dari berikut ini:
Aktivitas yang ada khusus untuk merespons notifikasi. Tidak ada alasan bagi pengguna untuk menavigasi ke aktivitas ini selama penggunaan aplikasi normal, jadi aktivitas tersebut akan memulai tugas baru dan bukannya ditambahkan ke tugas dan back stack yang sudah ada di aplikasi Anda. Ini adalah jenis intent yang dibuat dalam contoh sebelumnya.
Aktivitas yang ada dalam alur aplikasi reguler aplikasi Anda. Dalam hal ini, memulai aktivitas akan membuat back stack sehingga harapan pengguna untuk tombol Kembali dan Naik tetap dipertahankan.
Untuk berbagai cara dalam mengonfigurasi intent notifikasi Anda selengkapnya, lihat Memulai Aktivitas dari Notifikasi.
Menampilkan notifikasi
Untuk membuat notifikasi muncul, panggil
NotificationManagerCompat.notify()
,
lalu teruskan ID unik untuk notifikasi tersebut dan hasil dari
NotificationCompat.Builder.build()
.
Hal ini ditunjukkan dalam contoh berikut:
Kotlin
with(NotificationManagerCompat.from(this)) { if (ActivityCompat.checkSelfPermission( this@MainActivity, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, // grantResults: IntArray) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return@with } // notificationId is a unique int for each notification that you must define. notify(NOTIFICATION_ID, builder.build()) }
Java
with(NotificationManagerCompat.from(this)) { if (ActivityCompat.checkSelfPermission( this@MainActivity, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return } // notificationId is a unique int for each notification that you must define. notify(NOTIFICATION_ID, builder.build()) }
Simpan ID notifikasi yang Anda teruskan ke NotificationManagerCompat.notify()
,
karena Anda akan memerlukannya saat ingin memperbarui atau menghapus
notifikasi.
Selain itu, untuk menguji notifikasi dasar di perangkat yang berjalan di Android 13 dan yang lebih tinggi, aktifkan notifikasi secara manual atau buat dialog untuk meminta notifikasi.
Menambahkan tombol tindakan
Notifikasi dapat menawarkan hingga tiga tombol tindakan yang memungkinkan pengguna merespons dengan cepat, seperti menunda pengingat atau membalas pesan teks. Namun, tombol tindakan ini tidak boleh menduplikasi tindakan yang dilakukan saat pengguna mengetuk notifikasi.
Gambar 3. Notifikasi dengan satu tombol tindakan.
Untuk menambahkan tombol tindakan, teruskan PendingIntent
ke
metode
addAction()
. Cara ini seperti menyiapkan tindakan ketuk default notifikasi, tetapi bukannya meluncurkan aktivitas, Anda dapat melakukan hal lain seperti memulai BroadcastReceiver
yang akan menjalankan tugas di latar belakang sehingga tindakan tersebut tidak mengganggu aplikasi yang sudah terbuka.
Misalnya, kode berikut ini menunjukkan cara mengirim siaran ke penerima tertentu:
Kotlin
val ACTION_SNOOZE = "snooze" val snoozeIntent = Intent(this, MyBroadcastReceiver::class.java).apply { action = ACTION_SNOOZE putExtra(EXTRA_NOTIFICATION_ID, 0) } val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(this, 0, snoozeIntent, 0) val builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.ic_snooze, getString(R.string.snooze), snoozePendingIntent)
Java
String ACTION_SNOOZE = "snooze" Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class); snoozeIntent.setAction(ACTION_SNOOZE); snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0); PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(this, 0, snoozeIntent, 0); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.ic_snooze, getString(R.string.snooze), snoozePendingIntent);
Untuk mengetahui informasi selengkapnya tentang cara membuat BroadcastReceiver
untuk menjalankan tugas latar belakang, lihat Ringkasan siaran.
Jika Anda mencoba membuat notifikasi dengan tombol pemutaran media, seperti untuk menjeda dan melewati lagu, lihat cara membuat notifikasi dengan kontrol media.
Menambahkan tindakan balasan langsung
Tindakan balasan langsung yang diperkenalkan di Android 7.0 (API level 24) memungkinkan pengguna memasukkan teks langsung ke notifikasi. Teks kemudian dikirimkan ke aplikasi Anda tanpa membuka aktivitas. Misalnya, Anda dapat menggunakan tindakan balasan langsung untuk memungkinkan pengguna membalas pesan teks atau memperbarui daftar tugas dari dalam notifikasi.
Gambar 4. Mengetuk tombol "Balas" akan membuka input teks.
Tindakan balasan langsung muncul sebagai tombol tambahan dalam notifikasi yang membuka input teks. Saat pengguna selesai mengetik, sistem akan melampirkan respons teks ke intent yang Anda tentukan untuk tindakan notifikasi dan mengirimkan intent tersebut ke aplikasi Anda.
Menambahkan tombol balas
Untuk membuat tindakan notifikasi yang mendukung balasan langsung, ikuti langkah-langkah berikut:
- Buat instance
RemoteInput.Builder
yang dapat Anda tambahkan ke tindakan notifikasi. Konstruktor class ini menerima string yang digunakan sistem sebagai kunci untuk input teks. Aplikasi Anda kemudian menggunakan kunci tersebut untuk mengambil teks input.Kotlin
// Key for the string that's delivered in the action's intent. private val KEY_TEXT_REPLY = "key_text_reply" var replyLabel: String = resources.getString(R.string.reply_label) var remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run { setLabel(replyLabel) build() }
Java
// Key for the string that's delivered in the action's intent. private static final String KEY_TEXT_REPLY = "key_text_reply"; String replyLabel = getResources().getString(R.string.reply_label); RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) .setLabel(replyLabel) .build();
- Buat
PendingIntent
untuk tindakan balasan.Kotlin
// Build a PendingIntent for the reply action to trigger. var replyPendingIntent: PendingIntent = PendingIntent.getBroadcast(applicationContext, conversation.getConversationId(), getMessageReplyIntent(conversation.getConversationId()), PendingIntent.FLAG_UPDATE_CURRENT)
Java
// Build a PendingIntent for the reply action to trigger. PendingIntent replyPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), conversation.getConversationId(), getMessageReplyIntent(conversation.getConversationId()), PendingIntent.FLAG_UPDATE_CURRENT);
- Lampirkan objek
RemoteInput
ke suatu tindakan menggunakanaddRemoteInput()
.Kotlin
// Create the reply action and add the remote input. var action: NotificationCompat.Action = NotificationCompat.Action.Builder(R.drawable.ic_reply_icon, getString(R.string.label), replyPendingIntent) .addRemoteInput(remoteInput) .build()
Java
// Create the reply action and add the remote input. NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon, getString(R.string.label), replyPendingIntent) .addRemoteInput(remoteInput) .build();
- Terapkan tindakan tersebut pada notifikasi dan keluarkan notifikasinya.
Kotlin
// Build the notification and add the action. val newMessageNotification = Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .addAction(action) .build() // Issue the notification. with(NotificationManagerCompat.from(this)) { notificationManager.notify(notificationId, newMessageNotification) }
Java
// Build the notification and add the action. Notification newMessageNotification = new Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .addAction(action) .build(); // Issue the notification. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, newMessageNotification);
Sistem akan meminta pengguna untuk memasukkan respons ketika mereka memicu tindakan notifikasi, seperti yang ditunjukkan pada gambar 4.
Mengambil input pengguna dari balasan
Untuk menerima input pengguna dari UI balasan notifikasi, panggil
RemoteInput.getResultsFromIntent()
,
yang akan meneruskan Intent
yang diterima oleh BroadcastReceiver
Anda:
Kotlin
private fun getMessageText(intent: Intent): CharSequence? { return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY) }
Java
private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); if (remoteInput != null) { return remoteInput.getCharSequence(KEY_TEXT_REPLY); } return null; }
Setelah memproses teks, perbarui notifikasi dengan memanggil
NotificationManagerCompat.notify()
menggunakan ID dan tag yang sama, jika digunakan. Langkah ini diperlukan untuk menyembunyikan UI balasan langsung dan mengonfirmasi kepada pengguna bahwa balasan mereka diterima dan diproses dengan benar.
Kotlin
// Build a new notification, which informs the user that the system // handled their interaction with the previous notification. val repliedNotification = Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentText(getString(R.string.replied)) .build() // Issue the new notification. NotificationManagerCompat.from(this).apply { notificationManager.notify(notificationId, repliedNotification) }
Java
// Build a new notification, which informs the user that the system // handled their interaction with the previous notification. Notification repliedNotification = new Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentText(getString(R.string.replied)) .build(); // Issue the new notification. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, repliedNotification);
Saat menangani notifikasi baru ini, gunakan konteks yang diteruskan ke
metode
onReceive()
penerima.
Tambahkan balasan ke bagian bawah notifikasi dengan memanggil
setRemoteInputHistory()
.
Namun, jika Anda membuat aplikasi pesan, buat notifikasi gaya pesan dan tambahkan pesan baru ke percakapan.
Untuk saran notifikasi dari aplikasi pesan selengkapnya, lihat bagian tentang praktik terbaik untuk aplikasi pesan.
Menampilkan pesan penting
Aplikasi Anda mungkin perlu menampilkan pesan penting dan yang sensitif waktu, seperti panggilan telepon masuk atau alarm yang berdering. Dalam situasi ini, Anda dapat mengaitkan intent layar penuh dengan notifikasi Anda.
Saat notifikasi tersebut dipanggil, pengguna melihat salah satu dari yang berikut, bergantung pada status kunci perangkat:
- Jika perangkat pengguna terkunci, aktivitas layar penuh muncul, menutupi layar kunci.
- Jika perangkat pengguna tidak dikunci, notifikasi muncul dalam bentuk diperluas yang mencakup opsi untuk menangani atau mengabaikan notifikasi.
Cuplikan kode berikut menunjukkan cara mengaitkan notifikasi Anda dengan intent layar penuh:
Kotlin
val fullScreenIntent = Intent(this, ImportantActivity::class.java) val fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT) var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setFullScreenIntent(fullScreenPendingIntent, true)
Java
Intent fullScreenIntent = new Intent(this, ImportantActivity.class); PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setFullScreenIntent(fullScreenPendingIntent, true);
Menetapkan visibilitas layar kunci
Untuk mengontrol tingkat detail yang terlihat dalam notifikasi dari layar kunci, panggil
setVisibility()
dan tentukan salah satu nilai berikut:
VISIBILITY_PUBLIC
: konten lengkap notifikasi ditampilkan di layar kunci.VISIBILITY_SECRET
: tidak ada bagian notifikasi yang ditampilkan di layar kunci.VISIBILITY_PRIVATE
: hanya informasi dasar, seperti ikon notifikasi dan judul konten, yang ditampilkan di layar kunci. Konten lengkap notifikasi tidak ditampilkan.
Saat menetapkan VISIBILITY_PRIVATE
, Anda juga dapat memberikan versi alternatif
konten notifikasi yang menyembunyikan detail tertentu. Misalnya, aplikasi SMS dapat menampilkan notifikasi yang menunjukkan "Anda memiliki 3 pesan teks baru", tetapi menyembunyikan isi dan pengirim pesan. Untuk memberikan notifikasi alternatif ini, pertama-tama buat notifikasi alternatif dengan NotificationCompat.Builder
seperti biasa. Kemudian, lampirkan notifikasi alternatif ke notifikasi normal dengan
setPublicVersion()
.
Perlu diingat bahwa pengguna selalu memiliki kontrol utama atas apakah notifikasi mereka terlihat di layar kunci dan dapat mengontrolnya berdasarkan saluran notifikasi aplikasi Anda.
Memperbarui notifikasi
Untuk mengupdate notifikasi setelah Anda mengeluarkannya, panggil
NotificationManagerCompat.notify()
lagi, lalu teruskan ID yang sama dengan yang Anda gunakan
sebelumnya. Jika notifikasi sebelumnya ditutup, notifikasi baru akan dibuat sebagai gantinya.
Anda memiliki pilihan untuk memanggil
setOnlyAlertOnce()
sehingga notifikasi Anda menginterupsi pengguna—dengan suara, getaran, atau petunjuk visual—hanya saat pertama kali notifikasi muncul dan tidak untuk pembaruan lain setelahnya.
Menghapus notifikasi
Notifikasi akan tetap terlihat hingga salah satu hal berikut terjadi:
- Pengguna menutup notifikasi.
- Pengguna mengetuk notifikasi, jika Anda memanggil
setAutoCancel()
saat membuat notifikasi. - Anda memanggil
cancel()
untuk ID notifikasi tertentu. Metode ini juga menghapus notifikasi yang sedang berjalan. - Anda memanggil
cancelAll()
, yang menghapus semua notifikasi yang dikeluarkan sebelumnya. - Durasi yang ditentukan berlalu, jika Anda menetapkan waktu tunggu saat membuat
notifikasi, menggunakan
setTimeoutAfter()
. Jika diperlukan, Anda dapat membatalkan notifikasi sebelum durasi waktu tunggu yang ditentukan berlalu.
Praktik terbaik untuk aplikasi pesan
Pertimbangkan praktik terbaik yang tercantum di sini saat membuat notifikasi untuk aplikasi pesan dan chat Anda.
Menggunakan MessagingStyle
Mulai Android 7.0 (API level 24), Android menyediakan template gaya notifikasi khusus untuk konten aplikasi pesan. Dengan menggunakan
NotificationCompat.MessagingStyle
class, Anda dapat mengubah beberapa label yang ditampilkan pada notifikasi,
termasuk judul percakapan, pesan tambahan, dan tampilan isi untuk
notifikasi.
Cuplikan kode berikut menunjukkan cara menyesuaikan gaya notifikasi menggunakan class MessagingStyle
.
Kotlin
val user = Person.Builder() .setIcon(userIcon) .setName(userName) .build() val notification = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("2 new messages with $sender") .setContentText(subject) .setSmallIcon(R.drawable.new_message) .setStyle(NotificationCompat.MessagingStyle(user) .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson()) .addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson()) ) .build()
Java
Person user = new Person.Builder() .setIcon(userIcon) .setName(userName) .build(); Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("2 new messages with " + sender) .setContentText(subject) .setSmallIcon(R.drawable.new_message) .setStyle(new NotificationCompat.MessagingStyle(user) .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson()) .addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson()) ) .build();
Mulai Android 9.0 (level API 28), Anda juga harus menggunakan class
Person
untuk mendapatkan rendering notifikasi dan avatar yang optimal.
Saat menggunakan NotificationCompat.MessagingStyle
, lakukan hal berikut:
- Panggil
MessagingStyle.setConversationTitle()
untuk menetapkan judul chat grup dengan lebih dari dua orang. Judul percakapan yang baik dapat berupa nama chat grup atau daftar peserta dalam percakapan jika chat grup tidak memiliki nama. Tanpa judul ini, pesan mungkin salah diartikan sebagai percakapan pribadi dengan pengirim pesan terbaru dalam percakapan tersebut. - Gunakan metode
MessagingStyle.setData()
untuk menyertakan pesan media seperti gambar. Jenis MIME gambar pola/* didukung.
Menggunakan Balasan Langsung
Balasan Langsung memungkinkan pengguna membalas langsung suatu pesan.
- Setelah pengguna membalas dengan tindakan balasan inline, gunakan
MessagingStyle.addMessage()
untuk memperbarui notifikasiMessagingStyle
, dan jangan menarik kembali atau membatalkan notifikasi. Tidak membatalkan notifikasi memungkinkan pengguna mengirim beberapa balasan dari notifikasi. - Untuk membuat tindakan balasan inline yang kompatibel dengan Wear OS, panggil
Action.WearableExtender.setHintDisplayInlineAction(true)
. - Gunakan metode
addHistoricMessage()
untuk memberikan konteks ke percakapan balasan langsung dengan menambahkan pesan historis ke notifikasi.
Mengaktifkan Smart Reply
- Untuk mengaktifkan Smart Reply, panggil
setAllowGeneratedResponses(true)
pada tindakan balas. Hal ini akan membuat respons Smart Reply tersedia untuk pengguna saat notifikasi dihubungkan ke perangkat Wear OS. Respons Smart Reply dihasilkan oleh model machine learning yang sepenuhnya ada di smartwatch, menggunakan konteks yang diberikan notifikasiNotificationCompat.MessagingStyle
, dan tidak ada data yang diupload ke internet untuk menghasilkan respons.
Menambahkan metadata notifikasi
- Tetapkan metadata notifikasi untuk memberi tahu sistem cara menangani notifikasi aplikasi Anda saat perangkat dalam
Do Not Disturb mode
. Misalnya, gunakan metodeaddPerson()
atausetCategory(Notification.CATEGORY_MESSAGE)
untuk mengganti mode Jangan Ganggu.