Membuat Notifikasi

Notifikasi memberikan informasi singkat dan tepat waktu tentang peristiwa di aplikasi Anda saat sedang tidak digunakan. Halaman ini menunjukkan kepada Anda cara membuat notifikasi dengan berbagai fitur untuk Android 4.0 (API level 14) dan yang lebih baru. Untuk pengantar cara notifikasi muncul di Android, lihat Ringkasan Notifikasi. Untuk kode contoh yang menggunakan notifikasi, lihat Contoh Notifikasi Android.

Perhatikan bahwa kode pada halaman ini menggunakan API NotificationCompat dari Android support library. API tersebut memungkinkan Anda untuk menambahkan fitur yang tersedia hanya pada versi Android yang lebih baru sambil tetap memberikan kompatibilitas ke Android 4.0 (API level 14). Namun, beberapa fitur baru seperti tindakan balas inline mengakibatkan tidak adanya pengoperasian pada versi yang lebih lama.

Menambahkan support library

Meskipun sebagian besar project yang dibuat dengan Android Studio menyertakan dependensi yang diperlukan untuk menggunakan NotificationCompat, Anda harus memverifikasi bahwa file build.gradle tingkat modul Anda menyertakan dependensi berikut:

dependencies {
        implementation "com.android.support:support-compat:28.0.0"
    }
    

Membuat notifikasi dasar

Notifikasi dalam bentuk yang paling mendasar dan ringkas (juga dikenal sebagai formulir yang diciutkan) menampilkan ikon, judul, dan sejumlah kecil teks konten. Di bagian ini, Anda akan mengetahui cara membuat notifikasi yang dapat diklik pengguna untuk meluncurkan aktivitas di aplikasi Anda.

Gambar 1. Notifikasi dengan judul dan teks

Untuk detail selengkapnya tentang setiap bagian dari notifikasi, baca anatomi notifikasi.

Menetapkan konten notifikasi

Untuk memulai, Anda perlu menetapkan konten dan saluran notifikasi menggunakan objek NotificationCompat.Builder. Contoh berikut menunjukkan cara membuat notifikasi dengan:

  • Ikon kecil, ditetapkan oleh setSmallIcon(). Ini adalah satu-satunya konten yang dapat dilihat pengguna yang diperlukan.
  • Judul, ditetapkan oleh setContentTitle().
  • Teks isi, 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, Anda harus menetapkan kepentingan saluran—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);
    

Perhatikan bahwa constructor NotificationCompat.Builder mengharuskan Anda memberikan ID saluran. 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. Jika menginginkan notifikasi lebih lama, Anda dapat mengaktifkan notifikasi yang dapat diperluas dengan menambahkan template gaya dengan 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 dengan Detail yang Dapat Diperluas.

Membuat saluran dan menetapkan kepentingannya

Sebelum dapat menayangkan notifikasi pada Android 8.0 dan yang lebih baru, Anda harus mendaftarkan saluran notifikasi aplikasi Anda ke sistem dengan meneruskan instance NotificationChannel ke createNotificationChannel(). Sehingga, kode berikut akan 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 new and 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 new and 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, Anda harus menjalankan kode ini segera setelah aplikasi Anda dimulai. Aman untuk memanggilnya berulang kali karena membuat saluran notifikasi yang ada tidak akan menjalankan operasi apa pun.

Perhatikan bahwa constructor NotificationChannel membutuhkan importance, menggunakan salah satu konstanta dari class NotificationManager. Parameter ini menentukan cara menginterupsi pengguna untuk setiap notifikasi yang menjadi milik saluran ini—meskipun Anda juga harus menetapkan prioritas dengan setPriority() untuk mendukung Android 7.1 dan yang lebih lama (seperti yang ditunjukkan di atas).

Meskipun Anda harus menetapkan kepentingan/prioritas notifikasi seperti yang ditunjukkan di sini, sistem tidak menjamin perilaku pemberitahuan yang akan Anda dapatkan. Dalam beberapa kasus sistem mungkin mengubah tingkat kepentingan berdasarkan faktor-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, Anda harus menentukan intent konten yang ditentukan dengan objek PendingIntent dan meneruskannya 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, 0)

    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 will fire 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, 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)
            // Set the intent that will fire when the user taps the notification
            .setContentIntent(pendingIntent)
            .setAutoCancel(true);
    

Perhatikan panggilan kode ini setAutoCancel(), yang otomatis menghapus notifikasi ketika pengguna mengetuknya.

Metode setFlags() yang ditunjukkan di atas membantu menjaga pengalaman navigasi yang diharapkan pengguna setelah membuka aplikasi Anda melalui notifikasi. Tetapi jika ingin menggunakannya atau tidak, itu tergantung pada jenis aktivitas apa yang Anda mulai, yang mungkin merupakan salah satu dari:

  • Aktivitas yang ada khusus untuk merespons notifikasi. Tidak ada alasan bagi pengguna untuk menavigasi ke aktivitas selama penggunaan aplikasi normal, jadi aktivitas tersebut akan memulai tugas baru bukannya ditambahkan ke tugas dan back stack aplikasi Anda yang ada. Ini adalah jenis intent yang dibuat dalam contoh di atas.
  • Aktivitas yang ada dalam alur aplikasi reguler aplikasi Anda. Dalam hal ini, memulai aktivitas harus membuat back stack sehingga harapan pengguna untuk tombol Kembali dan Naik tetap dipertahankan.

Untuk berbagai cara dalam mengonfigurasi intent notifikasi Anda selengkapnya, baca Memulai Aktivitas dari Notifikasi.

Menampilkan notifikasi

Untuk membuat notifikasi muncul, panggil NotificationManagerCompat.notify(), dengan meneruskan ID unik untuk notifikasi tersebut dan hasil dari NotificationCompat.Builder.build(). Misalnya:

Kotlin

    with(NotificationManagerCompat.from(this)) {
        // notificationId is a unique int for each notification that you must define
        notify(notificationId, builder.build())
    }
    

Java

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

    // notificationId is a unique int for each notification that you must define
    notificationManager.notify(notificationId, builder.build());
    

Ingatlah untuk menyimpan ID notifikasi yang diteruskan ke NotificationManagerCompat.notify() karena Anda akan memerlukannya nanti jika inginmengupdate ataumenghapus notifikasi.

Menambahkan tombol tindakan

Notifikasi dapat menawarkan hingga tiga tombol tindakan yang memungkinkan pengguna merespons dengan cepat, seperti menunda pengingat atau bahkan membalas pesan teks. Namun, tombol tindakan tersebut seharusnya tidak menduplikasi tindakan yang dijalankan ketika pengguna mengetuk notifikasi.

Gambar 2. Notifikasi dengan satu tombol tindakan

Untuk menambahkan tombol tindakan, teruskan PendingIntent ke metode addAction(). Cara ini mirip dengan menyiapkan tindakan ketuk default notifikasi, tetapi bukannya meluncurkan aktivitas, melainkan 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 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

    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 informasi selengkapnya tentang membuat BroadcastReceiver dalam menjalankan tugas latar belakang, lihat Panduan 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, diperkenalkan di Android 7.0 (API level 24), memungkinkan pengguna untuk memasukkan teks langsung ke notifikasi, yang 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 3. 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 telah Anda tentukan untuk tindakan notifikasi dan mengirimkan intent tersebut ke aplikasi Anda.

Menambahkan tombol balas

Untuk membuat tindakan notifikasi yang mendukung balasan langsung:

  1. Buat instance RemoteInput.Builder yang dapat Anda tambahkan ke tindakan notifikasi. Constructor class ini akan menerima string bahwa sistem menggunakannya sebagai kunci untuk input teks. Kemudian, aplikasi perangkat genggam Anda akan menggunakan kunci tersebut untuk mengambil teks dari input tersebut.

    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();
        
  2. Buat PendingIntent untuk tindakan balas.

    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);
        

    Perhatian: Jika Anda menggunakan ulang PendingIntent, pengguna mungkin membalas percakapan yang berbeda dari yang mereka pikir telah mereka lakukan. Anda harus memberikan kode permintaan yang berbeda untuk setiap percakapan atau memberikan intent yang tidak menampilkan true saat Anda memanggil equals() pada intent balasan dari percakapan lainnya. ID percakapan sering diteruskan sebagai bagian dari paket tambahan intent, tetapi diabaikan saat Anda memanggil equals().

  3. Lampirkan objek RemoteInput ke tindakan menggunakan addRemoteInput().

    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();
        
  4. 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 3.

Mengambil input pengguna dari balasan

Untuk menerima input pengguna dari UI balasan notifikasi, panggil RemoteInput.getResultsFromIntent(), lalu teruskan 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 tersebut, Anda harus mengupdate notifikasi dengan memanggil NotificationManagerCompat.notify() bersama 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 bekerja dengan notifikasi baru ini, gunakan konteks yang diteruskan ke metode onReceive() penerima.

Anda juga harus menambahkan balasan ke bagian bawah notifikasi dengan memanggil setRemoteInputHistory(). Namun, jika bertujuan membuat aplikasi pesan, Anda harus membuat notifikasi gaya pesan dan menambahkan pesan baru ke percakapan.

Untuk saran notifikasi dari aplikasi pesan selengkapnya, lihat praktik terbaik untuk aplikasi pesan.

Menambahkan status progres

Notifikasi dapat menyertakan indikator progres beranimasi yang menampilkan status operasi yang sedang berjalan kepada pengguna.

Gambar 4. Status progres selama dan setelah operasi.

Jika Anda dapat memperkirakan jumlah operasi yang selesai setiap saat, gunakan bentuk indikator "pasti"; (seperti yang ditunjukkan pada gambar 4) dengan memanggil setProgress(max, progress, false). Parameter pertama adalah berapa nilai "keseluruhan" (seperti 100); yang kedua adalah berapa nilai yang saat ini selesai, dan yang terakhir menunjukkan ini adalah status progres pasti.

Saat operasi Anda berlanjut, teruslah memanggil setProgress(max, progress, false) dengan nilai yang diupdate untuk progress dan mengeluarkan ulang notifikasi.

Kotlin

    val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
        setContentTitle("Picture Download")
        setContentText("Download in progress")
        setSmallIcon(R.drawable.ic_notification)
        setPriority(NotificationCompat.PRIORITY_LOW
    }
    val PROGRESS_MAX = 100
    val PROGRESS_CURRENT = 0
    NotificationManagerCompat.from(this).apply {
        // Issue the initial notification with zero progress
        builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false)
        notify(notificationId, builder.build())

        // Do the job here that tracks the progress.
        // Usually, this should be in a
        // worker thread
        // To show progress, update PROGRESS_CURRENT and update the notification with:
        // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
        // notificationManager.notify(notificationId, builder.build());

        // When done, update the notification one more time to remove the progress bar
        builder.setContentText("Download complete")
                .setProgress(0, 0, false)
        notify(notificationId, builder.build())
    }
    

Java

    ...
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
    builder.setContentTitle("Picture Download")
            .setContentText("Download in progress")
            .setSmallIcon(R.drawable.ic_notification)
            .setPriority(NotificationCompat.PRIORITY_LOW);

    // Issue the initial notification with zero progress
    int PROGRESS_MAX = 100;
    int PROGRESS_CURRENT = 0;
    builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
    notificationManager.notify(notificationId, builder.build());

    // Do the job here that tracks the progress.
    // Usually, this should be in a
    // worker thread
    // To show progress, update PROGRESS_CURRENT and update the notification with:
    // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
    // notificationManager.notify(notificationId, builder.build());

    // When done, update the notification one more time to remove the progress bar
    builder.setContentText("Download complete")
            .setProgress(0,0,false);
    notificationManager.notify(notificationId, builder.build());
    

Pada akhir operasi tersebut, progress harus sama dengan max. Anda dapat membiarkan status progres ditampilkan saat operasi selesai, atau menghapusnya. Dalam kasus apa pun, ingatlah untuk mengupdate teks notifikasi guna menampilkan bahwa operasi telah selesai. Untuk menghapus status progres, panggil setProgress(0, 0, false).

Untuk menampilkan status progres yang tidak tentu (status yang tidak menunjukkan persentase selesai), panggil setProgress(0, 0, true). Hasilnya adalah sebuah indikator yang bergaya sama dengan status progres di atas, kecuali status progresnya adalah animasi berkelanjutan yang tidak menunjukkan progresnya. Animasi progres berjalan hingga Anda memanggil setProgress(0, 0, false) lalu mengupdate notifikasi untuk menghapus indikator aktivitas.

Ingatlah untuk mengubah teks notifikasi agar menunjukkan bahwa operasi selesai.

Menetapkan kategori seluruh sistem

Android menggunakan beberapa kategori seluruh sistem yang ditentukan sebelumnya untuk menentukan apakah akan mengganggu pengguna dengan notifikasi yang diberikan atau tidak ketika pengguna telah mengaktifkan mode Jangan Ganggu.

Jika notifikasi Anda masuk dalam salah satu dari kategori notifikasi yang sebelumnya ditentukan dalam NotificationCompat—seperti CATEGORY_ALARM, CATEGORY_REMINDER, CATEGORY_EVENT, atau CATEGORY_CALL—Anda harus mendeklarasikannya seperti itu dengan meneruskan kategori yang sesuai ke setCategory().

Kotlin

    var builder = NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.notification_icon)
            .setContentTitle("My notification")
            .setContentText("Hello World!")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setCategory(NotificationCompat.CATEGORY_MESSAGE)
    

Java

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.notification_icon)
            .setContentTitle("My notification")
            .setContentText("Hello World!")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setCategory(NotificationCompat.CATEGORY_MESSAGE);
    

Informasi tentang kategori notifikasi Anda ini digunakan oleh sistem untuk membuat keputusan tentang menampilkan notifikasi ketika perangkat dalam mode Jangan Ganggu.

Namun, Anda tidak diharuskan untuk menetapkan kategori seluruh sistem dan sebaiknya hanya melakukannya jika notifikasi Anda cocok dengan salah satu kategori yang ditentukan oleh dalam NotificationCompat.

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, tergantung pada status kunci perangkat:

  • Jika perangkat pengguna terkunci, aktivitas layar penuh muncul, menutupi layar kunci.
  • Jika perangkat pengguna tidak dikunci, notifikasi muncul dalam bentuk yang 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 dari nilai berikut:

  • VISIBILITY_PUBLIC menunjukkan konten lengkap notifikasi.
  • VISIBILITY_SECRET tidak menampilkan bagian apa pun dari notifikasi ini di layar kunci.
  • VISIBILITY_PRIVATE menunjukkan informasi dasar, seperti ikon notifikasi dan judul konten, tetapi menyembunyikan konten lengkap notifikasi.

Saat VISIBILITY_PRIVATE ditetapkan, Anda juga dapat memberikan versi alternatif dari isi notifikasi yang menyembunyikan detail tertentu. Misalnya,aplikasi SMS dapat menampilkan notifikasi yang menampilkan Anda memiliki 3 pesan teks baru, tetapi menyembunyikan isi dan pengirim pesan. Untuk memberikan notifikasi alternatif ini, pertama buat notifikasi alternatif dengan NotificationCompat.Builder seperti biasanya. Kemudian lampirkan notifikasi alternatif ke notifikasi normal dengan setPublicVersion().

Namun, pengguna selalu memiliki kontrol akhir atas apakah notifikasi mereka terlihat di layar kunci dan bahkan dapat mengontrolnya berdasarkan saluran notifikasi aplikasi Anda.

Mengupdate notifikasi

Untuk mengupdate notifikasi ini setelah Anda mengeluarkannya, panggil NotificationManagerCompat.notify() lagi, lalu teruskan notifikasi dengan ID yang sama dengan yang Anda gunakan sebelumnya. Jika notifikasi sebelumnya sudah ditutup, sebuah 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 update lain setelahnya.

Menghapus notifikasi

Notifikasi akan tetap terlihat hingga salah satu hal berikut terjadi:

  • Pengguna menutup notifikasi.
  • Pengguna mengklik notifikasi, dan Anda memanggil setAutoCancel() saat selesai membuat notifikasi tersebut.
  • 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.
  • Jika Anda menetapkan batas waktu saat membuat notifikasi menggunakan setTimeoutAfter(), sistem akan membatalkan notifikasi tersebut setelah durasi yang ditentukan berlalu. Jika diperlukan, Anda dapat membatalkan notifikasi sebelum durasi waktu tunggu yang ditetapkan berlalu.

Praktik terbaik untuk aplikasi pesan

Gunakan praktik terbaik yang tercantum di sini sebagai referensi cepat tentang apa yang harus diingat ketika 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 class NotificationCompat.MessagingStyle Anda dapat mengubah beberapa label yang ditampilkan pada notifikasi, termasuk judul percakapan, pesan tambahan, dan tampilan isi notifikasinya.

Cuplikan kode berikut menunjukkan cara menyesuaikan gaya notifikasi menggunakan class MessagingStyle.

Kotlin

    var notification = NotificationCompat.Builder(this, CHANNEL_ID)
            .setStyle(NotificationCompat.MessagingStyle("Me")
                    .setConversationTitle("Team lunch")
                    .addMessage("Hi", timestamp1, null) // Pass in null for user.
                    .addMessage("What's up?", timestamp2, "Coworker")
                    .addMessage("Not much", timestamp3, null)
                    .addMessage("How about lunch?", timestamp4, "Coworker"))
            .build()
    

Java

    Notification notification = new Notification.Builder(this, CHANNEL_ID)
            .setStyle(new NotificationCompat.MessagingStyle("Me")
                    .setConversationTitle("Team lunch")
                    .addMessage("Hi", timestamp1, null) // Pass in null for user.
                    .addMessage("What's up?", timestamp2, "Coworker")
                    .addMessage("Not much", timestamp3, null)
                    .addMessage("How about lunch?", timestamp4, "Coworker"))
            .build();
    

Mulai Android 8.0 (API level 26), notifikasi yang menggunakan class NotificationCompat.MessagingStyle akan menampilkan lebih banyak konten dalam bentuk yang diciutkan. Anda juga dapat menggunakan metode addHistoricMessage() untuk memberikan konteks pada percakapan dengan menambahkan pesan historis untuk notifikasi terkait pesan.

Saat menggunakan NotificationCompat.MessagingStyle:

  • Panggil MessagingStyle.setConversationTitle() untuk menetapkan judul grup chat dengan lebih dari dua orang. Judul percakapan yang baik dapat berupa nama grup chat atau daftar peserta dalam percakapan jika tidak memiliki nama tertentu. Tanpa judul tadi, pesan mungkin salah diartikan sebagai percakapan pribadi dengan pengirim pesan terbaru dalam percakapan tersebut.
  • Gunakan metode MessagingStyle.setData() ini untuk memasukkan pesan media seperti gambar. Jenis MIME, gambar pola/* saat ini didukung.

Menggunakan balasan langsung

Balasan Langsung memungkinkan pengguna untuk membalas langsung suatu pesan.

  • Setelah pengguna membalas dengan tindakan balasan inline, gunakan MessagingStyle.addMessage() untuk mengupdate notifikasi MessagingStyle dan jangan menarik kembali atau membatalkan notifikasi tersebut. Tidak membatalkan notifikasi memungkinkan pengguna untuk 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. Ini akan menyebabkan Smart Reply tersedia untuk pengguna saat notifikasi dihubungkan ke perangkat Wear OS. Respons Smart Reply dihasilkan sepenuhnya oleh model machine learning yang ada di jam tangan, menggunakan konteks yang diberikan notifikasi NotificationCompat.MessagingStyle dan tidak ada data yang diupload ke Internet untuk menghasilkan respons.

Menambahkan metadata notifikasi