Membuat notifikasi

Notifikasi memberikan informasi singkat dan tepat waktu tentang peristiwa di aplikasi Anda, sekaligus sedang tidak digunakan. Dokumen ini menunjukkan cara membuat notifikasi dengan berbagai fitur. Sebagai pengantar tentang cara notifikasi muncul di Android, lihat Ringkasan notifikasi. Untuk kode contoh yang menggunakan notifikasi, lihat dokumentasi Orang contoh di GitHub.

Kode di halaman ini menggunakan atribut NotificationCompat API dari Library AndroidX. API ini memungkinkan Anda menambahkan fitur yang hanya tersedia di versi Android yang lebih baru sambil tetap memberikan kompatibilitas ke Android 9 (API level 28). Namun, beberapa fitur, seperti tindakan balasan inline, mengakibatkan tidak adanya pengoperasian pada versi sebelumnya.

Menambahkan Library AndroidX Core

Meskipun sebagian besar project yang dibuat dengan Android Studio menyertakan dependensi untuk menggunakan NotificationCompat, pastikan bahwa level modul File build.gradle menyertakan dependensi berikut:

Groovy

dependencies {
    implementation "androidx.core:core:2.2.0"
}

Kotlin

dependencies {
    implementation("androidx.core:core-ktx:2.2.0")
}

Membuat notifikasi dasar

Notifikasi dalam bentuk yang paling dasar dan ringkas—juga dikenal sebagai diciutkan formulir—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 notifikasi, baca anatomi notifikasi.

Mendeklarasikan izin runtime

Android 13 (level API 33) dan yang lebih baru mendukung izin runtime untuk memposting notifikasi yang tidak dikecualikan (termasuk Layanan Latar Depan (FGS)) dari aplikasi.

Izin yang perlu Anda deklarasikan dalam file manifes aplikasi akan muncul dalam cuplikan kode berikut:

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

Untuk detail selengkapnya tentang izin runtime, lihat Izin runtime notifikasi.

Menetapkan konten notifikasi

Untuk memulai, setel konten dan saluran notifikasi menggunakan elemen NotificationCompat.Builder . Contoh berikut menunjukkan cara membuat notifikasi dengan berikut ini:

  • Ikon kecil, diatur oleh setSmallIcon() Ini adalah satu-satunya konten yang dapat dilihat pengguna yang diperlukan.

  • Judul, ditetapkan oleh setContentTitle()

  • Teks {i>body<i}, ditetapkan oleh setContentText()

  • Prioritas notifikasi, yang ditetapkan oleh setPriority(). Prioritas menentukan seberapa mengganggu notifikasi pada Android 7.1 dan versi sebelumnya. Untuk Android 8.0 dan yang lebih baru, atur tingkat kepentingan saluran sebagai yang ditampilkan di bagian berikutnya.

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 menyediakan saluran ke ID. Ini diperlukan untuk kompatibilitas dengan Android 8.0 (API level 26) dan belakang, tetapi diabaikan oleh versi sebelumnya.

Secara default, konten teks notifikasi dipotong agar pas dalam satu baris. Anda dapat menampilkan informasi tambahan dengan membuat notifikasi yang dapat diperluas.

Gambar 2. Dapat diperluas notifikasi dalam bentuk yang diciutkan dan diluaskan.

Jika menginginkan notifikasi lebih panjang, Anda dapat mengaktifkan notifikasi dengan menambahkan template gaya setStyle() Misalnya, kode berikut untuk 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 selengkapnya tentang gaya notifikasi besar lainnya, termasuk cara menambahkan gambar dan kontrol pemutaran media, lihat Membuat perluasan notifikasi.

Membuat saluran dan menetapkan kepentingannya

Agar dapat mengirimkan notifikasi di Android 8.0 dan yang lebih baru, daftarkan saluran notifikasi aplikasi dengan 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 Anda harus membuat saluran notifikasi sebelum memposting notifikasi di Android 8.0 dan yang lebih baru, jalankan kode ini segera setelah aplikasi memulai. Aman untuk memanggilnya berulang kali, karena membuat saluran notifikasi tidak melakukan operasi.

Konstruktor NotificationChannel memerlukan importance, menggunakan salah satu konstanta dari class NotificationManager. Ini menentukan cara menginterupsi pengguna untuk setiap notifikasi yang dimiliki ke channel ini. Tetapkan prioritas dengan setPriority() untuk mendukung Android 7.1 dan yang lebih lama, seperti yang ditunjukkan pada contoh sebelumnya.

Meskipun Anda harus mengatur tingkat kepentingan atau prioritas notifikasi seperti yang ditunjukkan dalam sistem tidak menjamin perilaku pemberitahuan yang Anda dapatkan. Di beberapa dalam beberapa kasus, sistem mungkin mengubah tingkat kepentingan berdasarkan faktor lain, dan pengguna selalu bisa mendefinisikan ulang tingkat kepentingan untuk suatu saluran TV Anda.

Untuk informasi selengkapnya tentang arti berbagai tingkatan, baca tentang tingkat kepentingan notifikasi level aplikasi.

Menetapkan tindakan ketuk notifikasi

Setiap notifikasi harus merespons ketukan, biasanya untuk membuka aktivitas di yang sesuai dengan notifikasi. Untuk melakukannya, tentukan intent konten ditentukan dengan 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, 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.

Metode setFlags() yang ditunjukkan dalam contoh sebelumnya mempertahankan navigasi yang diharapkan pengguna pengguna setelah mereka membuka aplikasi Anda menggunakan notifikasi. Anda mungkin ingin menggunakannya tergantung pada jenis aktivitas yang Anda mulai, yang dapat berupa salah satu hal berikut:

  • Aktivitas yang ada khusus untuk merespons notifikasi. Tidak ada alasan pengguna membuka aktivitas ini selama penggunaan aplikasi normal, agar aktivitas tersebut memulai tugas baru, bukan ditambahkan ke tugas yang ada dan kembali stack. 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 data sebelumnya sehingga harapan pengguna untuk tombol Kembali dan Naik tetap dipertahankan.

Untuk informasi selengkapnya tentang berbagai cara dalam mengonfigurasi intent notifikasi Anda, lihat Memulai Aktivitas dari Notifikasi.

Menampilkan notifikasi

Untuk memunculkan notifikasi, panggil NotificationManagerCompat.notify(), meneruskan ID unik untuk notifikasi 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 memerlukannya saat ingin memperbarui atau menghapus notifikasi.

Selain itu, untuk menguji notifikasi dasar pada perangkat yang berjalan di Android 13 dan yang lebih tinggi, aktifkan notifikasi secara manual atau buat dialog untuk notifikasi permintaan.

Menambahkan tombol tindakan

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

Gambar 3. Notifikasi dengan tombol tindakan.

Untuk menambahkan tombol tindakan, teruskan PendingIntent ke addAction() . Ini seperti menyiapkan tindakan ketuk default notifikasi, kecuali alih-alih meluncurkan aktivitas, Anda dapat melakukan hal lain seperti memulai BroadcastReceiver yang melakukan tugas di latar belakang sehingga tindakan 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 informasi selengkapnya tentang mem-build 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, diperkenalkan di Android 7.0 (API level 24), memungkinkan pengguna memasukkan teks secara langsung ke dalam notifikasi. Teks kemudian dikirimkan ke aplikasi tanpa membuka aktivitas. Misalnya, Anda dapat menggunakan tindakan balasan langsung yang memungkinkan pengguna membalas pesan teks atau memperbarui daftar tugas dari dalam notifikasi.

Gambar 4. Mengetuk "Balas" 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:

  1. Buat instance dari RemoteInput.Builder yang dapat Anda tambahkan ke tindakan notifikasi. Konstruktor class ini menerima sebuah {i>string<i} yang digunakan sistem sebagai kunci untuk {i>input <i}teks. Aplikasi Anda nanti menggunakan kunci itu untuk mengambil teks dari {i>input.<i}

    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 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);
      
  3. Lampirkan RemoteInput menjadi 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 meminta pengguna untuk memasukkan respons ketika mereka memicu tindakan notifikasi, seperti yang ditunjukkan dalam gambar 4.

Mengambil input pengguna dari balasan

Untuk menerima input pengguna dari UI balasan notifikasi, panggil RemoteInput.getResultsFromIntent(), 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. Ini adalah untuk menyembunyikan UI balasan langsung dan mengonfirmasi 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 gaya pesan notifikasi dan menambahkan pesan baru dalam percakapan.

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

Menambahkan status progres

Notifikasi dapat menyertakan indikator progres beranimasi yang menunjukkan kepada pengguna status operasi yang sedang berlangsung.

Gambar 5. Status progres selama untuk suatu operasi.

Jika Anda bisa memperkirakan berapa banyak operasi yang selesai kapan saja, gunakan "pasti" dalam bentuk indikator—seperti yang ditunjukkan dalam gambar 5—dengan memanggil setProgress(max, progress, false) Parameter pertama adalah apa yang dimaksud dengan nilainya, misalnya 100. Yang kedua adalah berapa banyak yang sudah selesai. Yang terakhir menunjukkan bahwa ini adalah kemajuan yang pasti .

Selagi operasi Anda berlanjut, panggil terus setProgress(max, progress, false) dengan nilai yang diperbarui untuk progress dan kirim ulang notifikasi, sebagai yang ditunjukkan dalam contoh berikut.

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 that tracks the progress here.
    // Usually, this is 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 once more 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 that tracks the progress here.
// Usually, this is 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 once more to remove the progress bar.
builder.setContentText("Download complete")
        .setProgress(0,0,false);
notificationManager.notify(notificationId, builder.build());

Di akhir operasi, progress harus sama dengan max. Anda dapat meninggalkan status progres untuk menunjukkan bahwa operasi telah selesai atau menghapusnya. Dalam kedua kasus tersebut, memperbarui teks notifikasi untuk menunjukkan bahwa operasi telah selesai. Untuk menghapus status progres, panggil setProgress(0, 0, false).

Untuk menampilkan status progres yang tidak tentu (status yang tidak menunjukkan penyelesaian persentase), panggil setProgress(0, 0, true). Hasilnya adalah sebuah indikator yang menunjukkan gaya yang sama dengan status progres sebelumnya, hanya saja ini adalah elemen yang tidak menunjukkan penyelesaian. Animasi progres akan terus berjalan hingga Anda memanggil setProgress(0, 0, false), lalu memperbarui notifikasi untuk menghapus indikator aktivitas.

Ingatlah untuk mengubah teks notifikasi agar menunjukkan bahwa operasi selesai.

Menetapkan kategori seluruh sistem

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

Jika notifikasi Anda termasuk dalam salah satu kategori notifikasi yang ditentukan di NotificationCompat—seperti CATEGORY_ALARM, CATEGORY_REMINDER, CATEGORY_EVENT, atau CATEGORY_CALL—deklarasikan 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);

Sistem menggunakan informasi tentang kategori notifikasi Anda ini untuk membuat keputusan tentang menampilkan notifikasi saat perangkat dalam mode Jangan Ganggu. Namun, Anda tidak harus menetapkan kategori seluruh sistem. Hanya lakukan jika notifikasi Anda cocok dengan salah satu kategori yang ditentukan 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 dipanggil, pengguna akan melihat salah satu dari yang berikut, tergantung pada status penguncian 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, panggilan telepon 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 menyetel VISIBILITY_PRIVATE, Anda juga dapat memberikan versi alternatif dari isi notifikasi yang menyembunyikan detail tertentu. Misalnya, aplikasi SMS mungkin menampilkan notifikasi yang menunjukkan "Anda memiliki 3 pesan teks baru", tapi akan menyembunyikan isi dan pengirim pesan. Untuk memberikan alternatif ini notifikasi, buat notifikasi alternatif terlebih dahulu dengan NotificationCompat.Builder seperti biasa. Kemudian, lampirkan notifikasi alternatif tersebut ke notifikasi normal dengan setPublicVersion()

Perlu diingat bahwa pengguna selalu memiliki kontrol akhir atas apakah notifikasi mereka terlihat di layar kunci dan dapat mengontrolnya berdasarkan saluran notifikasi aplikasi Anda.

Memperbarui notifikasi

Untuk memperbarui notifikasi setelah Anda mengeluarkannya, panggil NotificationManagerCompat.notify() lagi, meneruskan ID yang sama dengan yang Anda gunakan sebelumnya. Jika notifikasi sebelumnya ditutup, notifikasi baru akan dibuat sebagai gantinya.

Anda juga dapat memanggil setOnlyAlertOnce() sehingga notifikasi Anda mengganggu pengguna—dengan suara, getaran, atau visual petunjuk—hanya saat pertama kali notifikasi muncul dan bukan untuk kemudian pembaruan.

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 menelepon cancel() untuk ID notifikasi tertentu. Metode ini juga menghapus data yang sedang notifikasi.
  • Anda menelepon cancelAll(), yang menghapus semua notifikasi yang dikeluarkan sebelumnya.
  • Durasi yang ditentukan akan berlalu, jika Anda menyetel waktu tunggu saat membuat notifikasi, menggunakan setTimeoutAfter() Jika diperlukan, Anda dapat membatalkan notifikasi sebelum waktu tunggu yang ditentukan durasi yang berlalu.

Praktik terbaik untuk aplikasi pesan

Pertimbangkan praktik terbaik yang tercantum di sini saat membuat notifikasi untuk aplikasi pesan dan obrolan.

Menggunakan MessagingStyle

Mulai Android 7.0 (API level 24), Android menyediakan template gaya notifikasi khusus untuk konten pesan. Menggunakan NotificationCompat.MessagingStyle , Anda dapat mengubah beberapa label yang ditampilkan pada notifikasi, termasuk judul percakapan, pesan tambahan, dan tampilan konten 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 (API level 28), Anda juga perlu menggunakan Person untuk mendapatkan rendering notifikasi dan avatarnya yang optimal.

Saat menggunakan NotificationCompat.MessagingStyle, lakukan hal berikut:

  • Panggil MessagingStyle.setConversationTitle() untuk menetapkan judul chat grup dengan lebih dari dua orang. Bagus judul percakapan dapat berupa nama chat grup atau, jika bukan memiliki nama, daftar peserta dalam percakapan. Tanpa ini, pesan itu mungkin disangka sebagai percakapan pribadi dengan pengirim pesan terbaru dalam percakapan.
  • Gunakan metode MessagingStyle.setData() untuk menyertakan pesan media seperti gambar. Jenis MIME pola image/* didukung.

Gunakan Balasan Langsung

Balasan Langsung memungkinkan pengguna membalas pesan secara inline.

  • Setelah pengguna membalas dengan tindakan balasan inline, gunakan MessagingStyle.addMessage() untuk memperbarui notifikasi MessagingStyle, dan tidak mencabut atau membatalkan notifikasi. Tidak membatalkan notifikasi memungkinkan pengguna mengirim beberapa balasan dari notifikasi.
  • Agar tindakan balasan inline kompatibel dengan Wear OS, panggil Action.WearableExtender.setHintDisplayInlineAction(true)
  • Gunakan addHistoricMessage() metode untuk memberikan konteks ke percakapan balasan langsung dengan menambahkan pesan ke notifikasi.

Mengaktifkan Smart Reply

  • Untuk mengaktifkan Smart Reply, panggil setAllowGeneratedResponses(true) terkait tindakan balas. Ini menyebabkan respons Smart Reply tersedia untuk pengguna saat notifikasi dihubungkan ke perangkat Wear OS. Balasan Cerdas respons dihasilkan oleh model machine learning yang sepenuhnya ada di smartwatch, menggunakan konteks yang disediakan oleh NotificationCompat.MessagingStyle notifikasi, dan tidak ada data yang diupload ke internet untuk membuat yang dihasilkan.

Menambahkan metadata notifikasi