Menggunakan Notifikasi Android

Codelab ini adalah bagian dari kursus Lanjutan Android di Kotlin. Anda akan mendapatkan manfaat maksimal dari kursus ini jika Anda mengerjakan codelab secara berurutan, tetapi ini tidak wajib. Semua codelab kursus tercantum di halaman landing codelab Android Lanjutan di Kotlin.

Pengantar

Notifikasi adalah pesan yang ditampilkan kepada pengguna di luar UI aplikasi Anda. Notifikasi ditampilkan di bagian atas layar jika perangkat tidak terkunci atau, bergantung pada setelan keamanan, pada layar kunci saat perangkat terkunci.

Notifikasi umum terdiri dari judul, deskripsi, dan ikon. Notifikasi juga dapat memiliki tindakan yang dapat diklik, balasan cepat, konten yang dapat diperpanjang, dan gambar.

Notifikasi dapat mengirimkan materi secara tepat waktu, dan dapat memiliki tombol yang memungkinkan pengguna melakukan tindakan cepat, seperti mengirim balasan atau menunda alarm. Mengklik notifikasi akan mengarahkan pengguna ke tampilan di aplikasi Anda yang terkait dengan konten notifikasi.

Notifikasi adalah cara yang berguna untuk mengingatkan pengguna tentang tugas penting, memberi tahu mereka bahwa ada sesuatu yang terjadi, atau menyampaikan informasi penting yang mereka butuhkan segera saat aplikasi di latar belakang. Gunakan notifikasi seperlunya. Hal ini tidak hanya menghormati pengguna, tetapi juga membuat notifikasi aplikasi Anda mendapatkan perhatian yang layak.

Dalam codelab ini, Anda akan mempelajari cara membuat dan menggunakan notifikasi di aplikasi Android.

Yang harus sudah Anda ketahui

Anda harus memahami:

  • Cara membuat crate aplikasi Android di Kotlin. Khususnya, gunakan Android SDK.
  • Cara merancang aplikasi menggunakan Komponen Arsitektur dan data binding.
  • Pemahaman dasar tentang BroadcastReceivers
  • Pemahaman dasar tentang AlarmManager

Yang akan Anda pelajari

  • Cara membuat, menata gaya, dan mengirim notifikasi.
  • Cara membatalkan notifikasi.
  • Cara membuat saluran notifikasi.
  • Cara menambahkan tindakan cepat ke notifikasi.
  • Cara menampilkan badge notifikasi di ikon aplikasi.

Yang akan Anda lakukan

  • Menambahkan notifikasi ke aplikasi awal.
  • Batalkan notifikasi yang sebelumnya Anda kirim.
  • Buat saluran untuk berbagai jenis notifikasi.
  • Sesuaikan notifikasi di aplikasi awal.
  • Tambahkan Tindakan Cepat untuk membuat notifikasi Anda interaktif.
  • Nonaktifkan badge notifikasi.

Memasak telur sangat mudah, tetapi bisa menjadi tugas yang menantang jika Anda gagal melacak waktu. Dalam codelab ini, Anda akan mengerjakan aplikasi timer telur dan menyempurnakannya, sama seperti telur Anda di masa mendatang. Anda akan memulai dengan aplikasi timer telur yang berfungsi yang memungkinkan pengguna menyetel setelan waktu memasak yang berbeda untuk gaya telur yang berbeda. Timer menghitung mundur dari interval waktu yang dipilih dan menampilkan pesan toast saat telur siap.

Fungsi ini mungkin tampak fungsional, tetapi jauh dari sempurna dan tidak mudah digunakan. Sebagai permulaan, pesan toast hanya ditampilkan dalam jangka waktu singkat, sehingga mudah terlewatkan. Selain itu, jika aplikasi tidak ada di latar depan atau perangkat terkunci, tidak ada indikator visual untuk status timer setelah pesan toast menghilang.

Idealnya, timer telur harus menggunakan notifikasi untuk memberi tahu pengguna jika waktunya habis. Pengguna benar-benar perlu tahu telur sudah siap dengan segera. Jika tidak, telur akan menjadi terlalu matang! Notifikasi bersifat visual, dapat menyertakan suara, dan dapat membuat perangkat bergetar—semua cara untuk menarik perhatian pengguna. Dengan cara ini, Anda dapat mencapai telur yang sempurna dan pengguna yang puas dan puas.

Untuk mendapatkan aplikasi contoh, Anda dapat:

Clone repositori dari GitHub dan beralih ke cabang starter.

$  git clone https://github.com/googlecodelabs/android-kotlin-notifications


Atau, Anda dapat mendownload repositori sebagai file Zip, mengekstraknya, dan membukanya di Android Studio.

Download Zip

  1. Buka dan jalankan aplikasi di Android Studio.

Anda akan melihat gambar telur dan menu dropdown dengan daftar interval waktu yang telah ditentukan untuk memasak telur. Klik segitiga untuk menu drop-down Soft Boiled. Opsi pertama dalam daftar diberikan untuk tujuan pengujian dan menyetel alarm menjadi hanya 10 detik. Di samping daftar terdapat tombol yang memulai timer telur. Anda dapat menggunakan tombol ini untuk memulai dan menghentikan timer telur kapan saja. Kode awal berfungsi sepenuhnya, yang berarti Anda dapat menyiapkan timer telur dan melihatnya menghitung mundur hingga 0. Setelah timer selesai, pesan toast akan ditampilkan, seperti yang ditampilkan di bawah ini.

  1. Periksa kode sumber. Aplikasi awal terdiri dari satu aktivitas bernama MainActivity. Ada tiga subpaket bernama receiver, ui, dan util.

  • /receiver—Paket receiver berisi dua penerima siaran yang bernama AlarmReceiver dan SnoozeReceiver. AlarmReceiver dipicu oleh AlarmManager untuk mengirim notifikasi saat timer yang ditentukan pengguna habis. SnoozeReceiver menangani klik pengguna untuk menunda notifikasi.
  • /ui—Ini berisi EggTimerFragment yang merupakan bagian dari bagian UI aplikasi. EggTimerViewModel bertanggung jawab untuk memulai dan membatalkan timer serta untuk tugas aplikasi terkait siklus proses lainnya.
  • /util—Dalam paket ini ada dua file. BindingUtils.kt memiliki adaptor binding untuk mengaktifkan data binding antara UI aplikasi dan ViewModel. NotificationUtils.kt memiliki metode ekstensi di NotificationManager.

Menggunakan notifikasi adalah cara yang bagus untuk menarik perhatian pengguna ke aplikasi Anda. Notifikasi akan menampilkan jendela pop-up di bagian atas layar, baik suara maupun getaran. Aplikasi tidak berjalan atau berjalan di latar depan. Untuk membuat notifikasi, Anda perlu menggunakan builder notifikasi dan menyediakan teks judul, teks konten, dan ikon. Setelah builder memiliki semua kolom yang diperlukan, NotificationManager, yang merupakan layanan sistem, membantu Anda menampilkan konten ini sebagai notifikasi. NotificationManager bertanggung jawab untuk mengirim notifikasi, memperbarui kontennya, dan membatalkan notifikasi. Pada langkah berikut, Anda akan menambahkan metode ekstensi ke NotificationManager. Dengan cara ini, setiap kali Anda perlu menggunakan NotificationManager, Anda akan dapat menggunakan fungsi ekstensi ini untuk mencapai fungsi yang perlu Anda gunakan.

Langkah 1: Buat Notifikasi dasar

Dalam tugas ini, Anda akan membuat notifikasi baru, menyetel pesan untuk pengguna, dan mengirim notifikasi.

  1. Buka class NotificationUtils.kt dan temukan TODO: Step 1.1. Anda akan menemukan daftar tugas yang cocok dalam codelab ini dan kode aplikasi.
  2. Periksa fungsi sendNotification() yang ditentukan. Anda akan memperluas fungsi ekstensi ini ke NotificationManager untuk mengirim notifikasi.
//NotificationUtils.kt
// TODO: Step 1.1 extension function to send messages (GIVEN)
/**
 * Builds and delivers a notification.
 *
 * @param messageBody, notification text.
 * @param context, activity context.
 */
fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context) {
  1. Dapatkan instance pembuat notifikasi, teruskan konteks aplikasi dan ID saluran. ID saluran adalah nilai string untuk saluran.

Saluran Notifikasi adalah cara untuk mengelompokkan notifikasi. Dengan mengelompokkan jenis notifikasi yang serupa, developer dan pengguna dapat mengontrol semua notifikasi di saluran. Setelah dibuat, channel dapat digunakan untuk mengirimkan sejumlah notifikasi.

//NotificationUtils.kt
// TODO: Step 1.2 get an instance of NotificationCompat.Builder
val builder = NotificationCompat.Builder(
        applicationContext,
        applicationContext.getString(R.string.egg_notification_channel_id)
)
  1. Tetapkan ikon notifikasi untuk mewakili aplikasi, judul, dan teks konten untuk pesan yang ingin Anda berikan kepada pengguna. Anda akan melihat opsi lainnya untuk menyesuaikan notifikasi lebih lanjut di codelab, tetapi ini adalah jumlah minimum data yang harus Anda tetapkan untuk mengirim notifikasi.
//NotificationUtils.kt
   // TODO: Step 1.3 set title, text and icon to builder
   .setSmallIcon(R.drawable.cooked_egg)
   .setContentTitle(applicationContext.getString(R.string.notification_title))
   .setContentText(messageBody)
  1. Selanjutnya, Anda perlu memanggil notify() dengan ID unik untuk notifikasi Anda dan dengan objek Notification dari builder Anda.

ID ini mewakili instance notifikasi saat ini dan diperlukan untuk memperbarui atau membatalkan notifikasi ini. Karena aplikasi Anda hanya akan memiliki satu notifikasi aktif pada waktu tertentu, Anda dapat menggunakan ID yang sama untuk semua notifikasi. Anda sudah diberi konstanta untuk tujuan ini yang disebut NOTIFICATION_ID di NotificationUtils.kt. Perhatikan bahwa Anda dapat langsung memanggil notify() karena Anda melakukan panggilan dari fungsi ekstensi pada class yang sama.

//NotificationUtils.kt
   // TODO: Step 1.4 call notify to send the notification
    // Deliver the notification
    notify(NOTIFICATION_ID, builder.build())
  1. Buka ui/EggTimerViewModel.kt dan temukan fungsi startTimer(). Fungsi ini membuat alarm dengan interval waktu yang dipilih saat pengguna mengaktifkan timer telur.
  2. Anda akan memicu notifikasi dalam fungsi ini saat pengguna memulai timer. Untuk memanggil fungsi sendNotification() yang sebelumnya Anda terapkan, Anda memerlukan instance NotificationManager. NotificationManager adalah layanan sistem yang menyediakan semua fungsi yang diekspos untuk API notifikasi, termasuk fungsi ekstensi yang Anda tambahkan. Kapan pun Anda ingin mengirim, membatalkan, atau memperbarui notifikasi, Anda perlu meminta instance NotificationManager dari sistem. Panggil fungsi sendNotification()| dengan pesan notifikasi dan konteksnya.
// EggTimerViewModel.kt
// TODO: Step 1.5 get an instance of NotificationManager 
// and call sendNotification

val notificationManager = ContextCompat.getSystemService(
    app, 
    NotificationManager::class.java
) as NotificationManager
                notificationManager.sendNotification(app.getString(R.string.timer_running), app)

Anda hampir selesai. Namun, jika menjalankan aplikasi sekarang dan menyetel timer, Anda tidak akan mendapatkan notifikasi.

  1. Buka logcat dan telusuri "No Channel found". Anda akan melihat pesan error yang menyatakan bahwa egg_channel tidak ada. Pada langkah berikut, Anda akan mempelajari lebih lanjut Saluran Notifikasi dan memperbaikinya.

Langkah 2: Saluran Notifikasi

Mulai API level 26, semua notifikasi harus ditetapkan ke suatu saluran. Jika Anda menyentuh lama ikon peluncur aplikasi, memilih info aplikasi, dan mengetuk notifikasi, Anda akan melihat daftar saluran notifikasi yang terkait dengan aplikasi tersebut. Daftar ini kosong karena aplikasi Anda belum membuat saluran apa pun.

Saluran mewakili "type" notifikasi—misalnya, timer telur dapat mengirimkan notifikasi saat telur matang, dan juga menggunakan saluran lain untuk mengirim notifikasi harian guna mengingatkan Anda untuk sarapan dengan telur. Semua notifikasi di saluran dikelompokkan bersama, dan pengguna dapat mengonfigurasi setelan notifikasi untuk seluruh channel. Ini memungkinkan pengguna mempersonalisasi setelan notifikasi berdasarkan jenis notifikasi yang diinginkan. Misalnya, pengguna Anda dapat menonaktifkan notifikasi sarapan, tetapi masih memilih untuk melihat notifikasi dari timer.

Developer menetapkan setelan, nilai penting, dan perilaku awal, yang akan diterapkan ke semua notifikasi di saluran. Setelah setelan awal ditetapkan, pengguna dapat mengganti setelan ini.

Pada Langkah 1.1, Anda telah menggunakan egg_notification_channel_id sebagai saluran notifikasi. Jadi sekarang Anda perlu membuat dan menyesuaikan setelan notifikasi dan perilaku saluran ini.

  1. Buka EggTimerFragment.kt dan temukan fungsi createChannel().
  2. Teruskan ID saluran unik ke konstruktor NotificationChannel.
  3. Teruskan nama saluran notifikasi, yang juga akan dilihat pengguna di layar Setelan mereka.
  4. Sebagai parameter terakhir, teruskan tingkat kepentingan untuk saluran notifikasi. Tingkat kepentingan akan dibahas nanti dalam codelab ini, jadi untuk saat ini Anda dapat menggunakan NotificationManager.IMPORTANCE_LOW.
  5. Pada objek notificationChannel tetapkan enableLights ke benar. Setelan ini akan mengaktifkan lampu saat notifikasi ditampilkan.
  6. Pada objek notificationChannel setel lightColor ke merah untuk menampilkan lampu merah saat notifikasi ditampilkan.
  7. Pada objek notificationChannel, tetapkan enableVibration ke benar untuk mengaktifkan getaran.
  8. Di objek notificationChannel, tetapkan deskripsi saluran ke ‘Time for breakfast'.
  9. Dapatkan instance NotificationManager dengan memanggil getSystemService().
  10. Panggil createNotificationChannel() di NotificationManager dan teruskan objek notificationChannel yang Anda buat di langkah sebelumnya.
//EggTimerFragment.kt
private fun createChannel(channelId: String, channelName: String) {
    // TODO: Step 1.6 START create a channel
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val notificationChannel = NotificationChannel(
            channelId,
            channelName,
            // TODO: Step 2.4 change importance
            NotificationManager.IMPORTANCE_LOW
        )
        // TODO: Step 2.6 disable badges for this channel

        notificationChannel.enableLights(true)
        notificationChannel.lightColor = Color.RED
        notificationChannel.enableVibration(true)
        notificationChannel.description = "Time for breakfast"

        val notificationManager = requireActivity().getSystemService(
            NotificationManager::class.java
        )
        notificationManager.createNotificationChannel(notificationChannel)
    }
    // TODO: Step 1.6 END create channel
}
  1. Selanjutnya, untuk membuat saluran, Anda perlu memanggil fungsi createChannel() yang baru saja Anda tulis (Langkah 1.7). Fungsi ini menggunakan dua parameter, ID channel dan nama channel. Anda perlu mencari ID channel dan nama channel dari resource string yang sudah diberikan di project Anda.
// EggTimerFragment.kt
    // TODO: Step 1.7 call createChannel
    createChannel(
          getString(R.string.egg_notification_channel_id),
          getString(R.string.egg_notification_channel_name)
    )
  1. Anda harus meneruskan ID saluran ke builder notifikasi. Anda sudah melakukannya di Langkah 1.2. Menetapkan nilai yang salah sebagai ID saluran akan menyebabkan notifikasi gagal. Buka NotificationUtils.kt untuk memverifikasi bahwa ID channel yang Anda tetapkan sebelumnya sudah benar.
// NotificationUtils.kt
val builder = NotificationCompat.Builder(
        applicationContext,
       // TODO: Step 1.8 verify the notification channel name
        applicationContext.getString(R.string.egg_notification_channel_id)
)
  1. Jalankan aplikasi, dan Anda akan melihat aplikasi mengirim notifikasi setiap kali Anda memulai timer.
  2. Tarik status bar dan amati bahwa judul, konten, dan ikon notifikasi sama seperti yang Anda tetapkan di langkah sebelumnya.
  3. Untuk memverifikasi saluran yang baru dibuat, tutup aplikasi dan cari ikon aplikasi. Ketuk lama ikon aplikasi tersebut, lalu pilih Info aplikasi.

  1. Pilih Notifikasi dari daftar setelan. Anda akan melihat channel baru bernama Egg, tepat di bawah setelan Show notifications.

Saat Anda menjalankan aplikasi, notifikasi kini ditampilkan. Anda sebagai developer aplikasi dan pengguna dapat menyesuaikan setelan dan perilaku untuk semua notifikasi yang dikirim di saluran ini. Selamat, Anda telah membuat notifikasi!

Langkah 3: Tambahkan notifikasi ke aplikasi Anda

Sejauh ini, hal ini menunjukkan penggunaan dasar dari API notifikasi, tetapi mengirim notifikasi tepat setelah timer dimulai tidak lagi relevan. Pengguna mungkin lebih suka diberi tahu saat telur siap. Di bagian codelab berikut, Anda akan memperbaiki hal ini dan mengubah pesan toast menjadi notifikasi.

Anda telah mengirim notifikasi dan mengamati bagaimana notifikasi tersebut ditampilkan kepada pengguna, tetapi ini hanyalah langkah pertama untuk membuat notifikasi yang menarik. Pada langkah ini, Anda akan mengubah notifikasi agar dikirim pada waktu yang lebih tepat.

Aplikasi Anda menggunakan AlarmManager untuk menyiapkan alarm. Kode yang terkait dengan AlarmManager sudah diberikan dalam kode awal dan digunakan untuk menampilkan pesan toast. AlarmManager melacak pilihan waktu yang diinginkan dan akan memicu fungsi onReceive() dari AlarmReceiver.kt saat waktunya habis. Jika membuka AlarmReceiver.kt dan membuka onReceive(), Anda akan melihat pesan toast yang ditampilkan setiap kali menyiapkan timer telur.

  1. Buka AlarmReceiver.kt, instance NotificationManager, dan panggil fungsi sendNotification() dengan teks pesan dan parameter konteks.
// AlarmReceiver.kt
   // TODO: Step 1.9 add call to sendNotification
   val notificationManager = ContextCompat.getSystemService(
       context, 
       NotificationManager::class.java
   ) as NotificationManager
             
   notificationManager.sendNotification(
       context.getText(R.string.eggs_ready).toString(), 
       context
   )
  1. Opsional, hapus toast karena aplikasi Anda akan mengirim notifikasi saat timer habis.
// AlarmReceiver.kt
     // TODO: Step 1.10 [Optional] remove toast
//   Toast.makeText(
//       context, 
//       context.getText(R.string.eggs_ready),
//       Toast.LENGTH_SHORT
//   ).show()
  1. Jalankan aplikasi Anda . Anda akan melihat notifikasi setiap kali memulai timer dan setiap kali timer habis.

Ini tidak ideal. Anda tidak ingin mengirim terlalu banyak notifikasi kepada pengguna. Anda dapat menghapus notifikasi pertama yang dikirim saat pengguna memulai timer.

  1. Buka EggTimerFragment.kt dan hapus kode notifikasi untuk Langkah 1.5.
// EggTimeViewModel.kt

// TODO: Step 1.5 get an instance of NotificationManager 
// and call sendNotification
// val notificationManager = ContextCompat.getSystemService(
//      app,
//      NotificationManager::class.java
// ) as NotificationManager
// notificationManager.sendNotification(app.getString(R.string.eggs_ready), app)
  1. Jalankan aplikasi Anda lagi.
  2. Setel timer, letakkan di latar belakang, dan tunggu hingga selesai. Anda akan melihat notifikasi. Ini adalah notifikasi yang jauh lebih berguna.

Langkah 4: Tambahkan intent konten

  1. Jalankan kembali aplikasi, jika aplikasi belum berjalan.
  2. Klik notifikasi. Tidak ada yang terjadi.

Menampilkan notifikasi dan memberi tahu pengguna adalah hal yang bagus, tetapi saat pengguna mengklik notifikasi, mereka akan kembali ke aplikasi yang sesuai. Di bagian codelab ini, Anda akan menambahkan intent ke notifikasi untuk membawa pengguna kembali ke layar timer.

Intent adalah objek messaging yang dapat Anda gunakan untuk meminta tindakan dari komponen aplikasi lain. Intent dapat digunakan untuk memulai aktivitas, layanan, atau mengirimkan siaran. Dalam hal ini, Anda menggunakan intent ini untuk memberi tahu sistem agar membuka MainActivity saat pengguna mengetuk notifikasi. Karena aplikasi Anda hanya terdiri dari satu tampilan, Anda tidak memiliki banyak opsi di sini. Namun, dalam aplikasi yang lebih besar, notifikasi harus menciptakan pengalaman yang lancar dengan membawa pengguna ke layar yang sesuai untuk saat mereka berinteraksi dengan notifikasi.

  1. Buka NotificationUtils.kt dan temukan fungsi ekstensi sendNotification().
  2. Buat Intent dengan applicationContext Anda dan aktivitas yang akan diluncurkan, MainActivity::class.java.
// NotificationUtils.kt

fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context) {
    // Create the content intent for the notification, which launches
    // this activity
   // TODO: Step 1.11 create intent
    val contentIntent = Intent(applicationContext, MainActivity::class.java)

Anda membuat intent, tetapi notifikasi ditampilkan di luar aplikasi. Untuk membuat intent berfungsi di luar aplikasi, Anda perlu membuat PendingIntent baru.

PendingIntent memberikan hak kepada aplikasi atau sistem lain untuk menjalankan operasi atas nama aplikasi Anda. PendingIntent itu sendiri hanyalah referensi ke token yang dikelola oleh sistem yang menjelaskan data asli yang digunakan untuk mengambilnya. Ini berarti bahwa, meskipun proses aplikasi miliknya dihentikan, PendingIntent itu sendiri akan tetap dapat digunakan dari proses lain yang telah diberikan. Dalam hal ini, sistem akan menggunakan intent tertunda untuk membuka aplikasi atas nama Anda, terlepas dari apakah aplikasi timer berjalan atau tidak.

  1. Buat PendingIntent dengan applicationContext, NOTIFICATION_ID, contentIntent yang Anda buat di langkah sebelumnya, dan flag PendingIntent. Flag PendingIntent menentukan opsi untuk membuat PendingIntent baru atau menggunakan yang sudah ada. Anda harus menetapkan PendingIntent.FLAG_UPDATE_CURRENT sebagai tanda karena Anda tidak ingin membuat notifikasi baru jika sudah ada notifikasi. Dengan cara ini Anda akan memodifikasi PendingIntent saat ini yang terkait dengan intent yang Anda berikan.
// NotificationUtils.kt
   // TODO: Step 1.12 create PendingIntent
    val contentPendingIntent = PendingIntent.getActivity(
        applicationContext, 
        NOTIFICATION_ID,
        contentIntent,
        PendingIntent.FLAG_UPDATE_CURRENT
    )
  1. Teruskan PendingIntent ke notifikasi Anda. Anda dapat melakukannya dengan memanggil setContentIntent() di NotificationBuilder. Sekarang, saat Anda mengklik notifikasi, PendingIntent akan dipicu, membuka MainActivity.
  2. Tetapkan juga setAutoCancel() ke true, sehingga saat pengguna mengetuk notifikasi, notifikasi akan menutup dirinya sendiri saat pengguna diarahkan ke aplikasi.
// NotificationUtils.kt
    // TODO: Step 1.13 set content intent
    .setContentIntent(contentPendingIntent)
    .setAutoCancel(true)
  1. Jalankan kembali aplikasi.
  2. Setel timer, letakkan aplikasi di latar belakang, dan tunggu hingga notifikasi muncul.
  3. Setelah Anda melihat notifikasi, klik notifikasi dengan menarik status bar ke bawah, dan amati cara aplikasi dibawa ke latar depan.

Langkah 5: Batalkan notifikasi

Anda memiliki timer telur yang berfungsi dengan notifikasi, tetapi ada masalah kecil. Jika Anda menyetel timer, mendapatkan notifikasi, dan menyetelnya lagi, notifikasi sebelumnya akan tetap berada di status bar saat timer baru berjalan. Hal ini dapat membingungkan pengguna jika aplikasi berada di latar belakang, dan dapat menyebabkan telur mentah.

Untuk memperbaikinya, Anda perlu menghapus notifikasi sebelumnya saat memulai timer baru. Mulai dengan membuat fungsi ekstensi lain di NotificationUtils.kt. NotificationManager memiliki API untuk membatalkan semua notifikasi aktif yang disebut cancelAll().

  1. Buka NotificationsUtil.kt.
  2. Tambahkan fungsi ekstensi di NotificationManager yang memanggil cancelAll().
// NotificationUtils.kt

// TODO: Step 1.14 Cancel all notifications
/**
 * Cancels all notifications.
 *
 */
fun NotificationManager.cancelNotifications() {
    cancelAll()
}
  1. Buka EggTimerViewModel.kt dan buka fungsi startTimer().
  2. Di dalam startTimer(), Dapatkan instance NotificationManager dari sistem dan panggil cancelNotifications().
//  EggTimerViewModel.kt
   //TODO Step 1.15 call cancel notification
    val notificationManager =
       ContextCompat.getSystemService(
            app,
            NotificationManager::class.java
        ) as NotificationManager
    notificationManager.cancelNotifications()       
  1. Jalankan aplikasi dan mulai timer.
  2. Setelah Anda melihat notifikasi, mulai timer lagi dan amati bagaimana aplikasi kami otomatis menghapus notifikasi sebelumnya dari status bar.

Framework notifikasi memberikan berbagai opsi penyesuaian bagi developer untuk mengatur tindakan kustom dan mengatur gaya notifikasi sesuai kebutuhan. Selama tugas ini, Anda akan mempelajari cara menyesuaikan notifikasi timer telur.

Langkah 1: Sesuaikan gaya notifikasi

Menata gaya notifikasi sesuai dengan kebutuhan dan konten notifikasi akan membuat notifikasi Anda terlihat lebih menarik dan lebih terlihat seperti ekstensi aplikasi Anda. Framework notifikasi dilengkapi dengan beberapa gaya bawaan untuk membantu, dan Anda selalu dapat membuatnya sendiri.

NotificationCompat menawarkan gaya bawaan untuk:

  • BigTextStyle, yang dapat menampilkan blok teks besar, seperti menampilkan konten email saat diluaskan.
  • BigPictureStyle, yang menunjukkan notifikasi berformat besar yang menyertakan lampiran gambar berukuran besar.
  • InboxStyle, yang menampilkan konten teks gaya percakapan.
  • MediaStyle, yang menampilkan kontrol untuk pemutaran media.
  • MessagingStyle, yang menampilkan notifikasi berformat besar yang menyertakan beberapa pesan di antara sejumlah orang.

Anda dapat menemukan info selengkapnya tentang gaya lain dalam dokumentasi untuk Membuat Notifikasi yang Dapat Diperluas. Pada langkah ini, Anda akan menggunakan NotificationCompat.BigPictureStyle untuk membuat notifikasi yang dapat diluaskan yang menampilkan gambar telur berukuran besar saat diluaskan.

  1. Buka NotificationUtils.kt dan temukan fungsi sendNotification().
  2. Mulai dengan memuat gambar dari resources menggunakan BitmapFactory.
// NotificationUtils.kt

// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
     applicationContext.resources, 
     R.drawable.cooked_egg
)
  1. Buat BigPictureStyle baru dan tetapkan gambar Anda.
  2. Tetapkan bigLargeIcon() ke null sehingga ikon besar akan hilang saat notifikasi diperluas.
// NotificationUtils.kt

// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
     applicationContext.resources, 
     R.drawable.cooked_egg
)
val bigPicStyle = NotificationCompat.BigPictureStyle()
        .bigPicture(eggImage)
        .bigLargeIcon(null)
  1. Setel gaya dengan setStyle() ke bigPicStyle.
  2. Setel ikon besar dengan setLargeIcon() ke eggImage, sehingga gambar akan ditampilkan sebagai ikon yang lebih kecil saat notifikasi diciutkan.
// NotificationUtils.kt
// TODO: Step 2.1 add style to builder
.setStyle(bigPicStyle)
.setLargeIcon(eggImage)
  1. Jalankan aplikasi dan setel timer. Saat pertama kali ditampilkan, notifikasi berada dalam status diciutkan di panel samping notifikasi. Jika Anda memperluas notifikasi, gambar besar akan ditampilkan di area notifikasi yang diperluas.

Langkah 2: Tindakan notifikasi

Tindakan notifikasi adalah penyesuaian lain yang dapat Anda tambahkan ke notifikasi. Notifikasi Anda saat ini dialihkan ke aplikasi saat pengguna mengkliknya. Selain tindakan notifikasi default ini, Anda bisa menambahkan tombol tindakan yang menyelesaikan tugas terkait aplikasi dari notifikasi.

Notifikasi dapat menawarkan hingga tiga tombol tindakan yang memungkinkan pengguna merespons dengan cepat, seperti menunda pengingat atau membalas pesan teks. Tombol tindakan ini seharusnya tidak menduplikasi tindakan yang dilakukan saat pengguna mengetuk notifikasi.

Untuk menambahkan tombol tindakan, teruskan PendingIntent ke fungsi addAction() di builder. Ini mirip dengan menyiapkan tindakan ketuk default notifikasi dengan memanggil setContentIntent(), kecuali meluncurkan aktivitas, Anda dapat melakukan berbagai hal lainnya, misalnya, memulai BroadcastReceiver yang melakukan tugas di latar belakang sehingga tindakan tidak mengganggu aplikasi yang sudah terbuka.

Dalam codelab ini, Anda sudah diberi BoadcastReceiver bernama SnoozeReceiver. Anda akan menggunakan SnoozeReceiver untuk menerima klik pengguna pada tindakan Notifikasi. Pada langkah berikut, Anda akan menambahkan kode untuk menunda notifikasi timer telur selama 60 detik saat pengguna mengklik tombol tindakan tunda. Saat tindakan tunda diklik, SnoozeReceiver akan menerima intent dan akan membuat alarm baru untuk mengirim notifikasi baru setelah 60 detik.

  1. Buka SnoozeReceiver.kt. Class ini mirip dengan AlarmReceiver yang Anda gunakan sebelumnya. Pada langkah berikut, Anda akan menambahkan kode yang akan memicu fungsi onReceive() dari SnoozeReceiver. Singkatnya, kode dalam SnoozeReceiver akan membuat alarm baru untuk mengirimkan notifikasi baru satu menit kemudian. Scroll ke bagian bawah fungsi onReceive, dapatkan instance notificationsManager dari sistem dan panggil cancelAll.
// SnoozeReceiver.kt
        val notificationManager = ContextCompat.getSystemService(
            context,
            NotificationManager::class.java
        ) as NotificationManager
        notificationManager.cancelAll()
  1. Untuk menggunakan SnoozeReceiver, buka NotificationUtils.kt.
  2. Buat Intent snoozeIntent baru untuk SnoozeReceiver tepat setelah gaya dalam fungsi sendNotification().
  3. Buat intent tertunda dengan memanggil metode getBroadcast() di PendingIntent yang mengharapkan parameter dalam langkah-langkah berikut. PendingIntent ini akan digunakan oleh sistem untuk menyiapkan alarm baru untuk memposting notifikasi baru setelah 60 detik saat tombol tidur sebentar diketuk oleh pengguna.
  4. Parameter pertama adalah konteks aplikasi tempat PendingIntent ini harus memulai aktivitas.
  5. Parameter kedua adalah kode permintaan, yang merupakan kode permintaan untuk intent yang tertunda ini. Jika perlu memperbarui atau membatalkan intent tertunda ini, Anda harus menggunakan kode ini untuk mengakses intent yang tertunda.
  6. Selanjutnya, tambahkan objek snoozeIntent, yang merupakan intent dari aktivitas yang akan diluncurkan.
  7. Terakhir, tambahkan nilai flag #FLAG_ONE_SHOT karena intent hanya akan digunakan satu kali. Tindakan cepat dan notifikasi akan hilang setelah ketukan pertama yang membuat intent hanya bisa digunakan sekali.
// NotificationUtils.kt

// TODO: Step 2.2 add snooze action
val snoozeIntent = Intent(applicationContext, SnoozeReceiver::class.java)
val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(
    applicationContext, 
    REQUEST_CODE, 
    snoozeIntent, 
    FLAGS
)
  1. Selanjutnya, panggil fungsi addAction() pada notificationBuilder. Fungsi ini mengharapkan ikon dan teks untuk menjelaskan tindakan Anda kepada pengguna. Anda juga perlu menambahkan snoozeIntent. Intent ini akan digunakan untuk memicu boadcastReceiver yang tepat saat tindakan Anda diklik.
// NotificationUtils.kt
// TODO: Step 2.3 add snooze action
.addAction(
    R.drawable.egg_icon, 
    applicationContext.getString(R.string.snooze),
    snoozePendingIntent
)
  1. Jalankan aplikasi pengatur waktu untuk menguji tindakan tunda.
  2. Jalankan timer dan letakkan aplikasi di latar belakang. Setelah timer aktif, luaskan notifikasi dan Anda akan melihat notifikasi sekarang memiliki tombol tindakan tunda yang menunda timer telur selama satu menit lagi.

Langkah 3: Tingkat kepentingan notifikasi

Tingkat kepentingan menentukan seberapa banyak notifikasi harus diganggu oleh pengguna secara visual dan audio. Notifikasi dengan tingkat kepentingan yang lebih tinggi akan lebih mengganggu pengguna.

Anda harus menentukan tingkat kepentingan di konstruktor NotificationChannel. Anda awalnya menyetel tingkat kepentingan yang rendah untuk aplikasi timer telur. Anda dapat menggunakan salah satu dari lima tingkat kepentingan, mulai dari IMPORTANCE_NONE(0) hingga IMPORTANCE_HIGH(4). Tingkat kepentingan yang Anda tetapkan ke suatu channel berlaku untuk semua pesan notifikasi yang Anda posting ke channel tersebut.

Tingkat Kepentingan Channel

Tingkat kepentingan yang terlihat oleh pengguna

Tingkat kepentingan (Android 8.0 dan yang lebih tinggi)

Prioritas (Android 7.1 dan yang lebih rendah)

Berbunyi dan muncul sebagai notifikasi pendahuluan (muncul di bagian atas layar)

IMPORTANCE_HIGH

PRIORITY_HIGH / PRIORITY_MAX

Berbunyi

IMPORTANCE_DEFAULT

PRIORITY_DEFAULT

Tanpa suara

IMPORTANCE_LOW

PRIORITY_LOW

Tidak ada bunyi dan tidak muncul di status bar.

IMPORTANCE_MIN

PRIORITAS

Untuk informasi tentang cara memilih tingkat prioritas yang sesuai, lihat "Tingkat prioritas" dalam Panduan desain notifikasi. Anda harus berhati-hati saat memilih tingkat kepentingan untuk notifikasi di aplikasi Anda. Tingkat kepentingan saluran harus dipilih dengan mempertimbangkan waktu dan perhatian pengguna. Saat notifikasi yang tidak penting disamarkan sebagai notifikasi yang mendesak, notifikasi tersebut dapat menghasilkan alarm yang tidak perlu dan mengalihkan perhatian. Pengguna memiliki kontrol penuh atas tingkat kepentingan notifikasi mereka, sehingga jika Anda membuat notifikasi yang mengganggu, mereka dapat menonaktifkan channel notifikasi sepenuhnya.

Saat pertama kali membuat notifikasi di Langkah 1.6, timer telur disetel untuk mengirimkan notifikasi dengan prioritas rendah karena didesain untuk tidak mengganggu pengguna dengan notifikasi. Namun, mungkin sebaiknya Anda menarik perhatian pengguna sebelum telur matang terlalu lama. Untuk mengubah tingkat kepentingan notifikasi, mulailah dengan setelan channel. Tingkat kepentingan saluran memengaruhi tingkat gangguan semua notifikasi yang diposting di saluran, dan harus ditentukan dalam konstruktor NotificationChannel.

  1. Untuk mengubah tingkat kepentingan saluran notifikasi aplikasi Anda, buka EggTimerFragment.kt dan buka createChannel(). Ubah tingkat kepentingan dari IMPORTANCE_LOW menjadi IMPORTANCE_HIGH.
// EggTimerFragment.kt
    val notificationChannel = NotificationChannel(
        channelId,
        channelName,
        // TODO: Step 2.4 change importance
        NotificationManager.IMPORTANCE_HIGH
    )

Untuk mendukung perangkat yang menjalankan Android 7.1 (API level 25) atau lebih rendah, Anda juga harus memanggil setPriority() untuk setiap notifikasi, menggunakan konstanta prioritas dari class NotificationCompat.

  1. Buka NotificationUtils.kt dan tambahkan kode berikut ke objek builder notifikasi.
// NotificationUtils.kt
   .addAction(
       R.drawable.common_google_signin_btn_icon_dark,
       applicationContext.getString(R.string.snooze),
       snoozePendingIntent
    )
   // TODO: Step 2.5 set priority
    .setPriority(NotificationCompat.PRIORITY_HIGH)
  1. Sebelum menjalankan aplikasi, klik lama ikon aplikasi di perangkat atau emulator, lalu pilih uninstal untuk menghapus setelan saluran sebelumnya. Jika Anda gagal meng-uninstal aplikasi, setelan prioritas saluran tidak akan berubah dan hal ini akan menyebabkan tidak ada perubahan perilaku saat notifikasi diposting.
  2. Sekarang jalankan aplikasi lagi dan mulai timer. Kali ini, saat notifikasi dikirimkan, Anda akan melihat pop-up yang muncul di bagian atas layar, terlepas dari apakah aplikasi Anda berjalan di latar depan atau latar belakang.

Langkah 4: Badge notifikasi

Badge notifikasi adalah titik-titik kecil yang muncul pada ikon peluncur aplikasi terkait saat aplikasi memiliki notifikasi aktif. Pengguna dapat menekan lama ikon aplikasi untuk membuka notifikasi.

Titik-titik ini, yang disebut badge, muncul secara default, dan tidak ada yang perlu dilakukan oleh aplikasi Anda. Namun, mungkin ada situasi saat badge tidak masuk akal untuk notifikasi Anda, sehingga Anda dapat menonaktifkannya per saluran dengan memanggil setShowBadge(false) pada objek NotificationChannel Anda. Karena timer telur hanya memiliki satu notifikasi aktif pada waktu tertentu, badge di ikon aplikasi Anda tidak menawarkan banyak manfaat bagi pengguna. Pada langkah berikut, Anda akan menonaktifkan badge dan hanya menampilkan notifikasi untuk timer telur.

  1. Tambahkan setShowBadge(false) ke kode pembuatan saluran untuk timer telur untuk menonaktifkan badge.
// EggTimerFragment.kt

    ).apply {
        // TODO: Step 2.6 disable badges for this channel
        setShowBadge(false)
    }
  1. Jalankan aplikasi lagi, mulai timer, dan tonton ikon aplikasi. Anda tidak akan melihat badge di ikon aplikasi.

Kode solusi ada di cabang master kode yang Anda download.

Kursus Udacity:

Dokumentasi developer Android:

Untuk link ke codelab lainnya dalam kursus ini, lihat halaman landing codelab Android Lanjutan di Kotlin.