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.
- 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.
- Periksa kode sumber. Aplikasi awal terdiri dari satu aktivitas bernama
MainActivity
. Ada tiga subpaket bernamareceiver
,ui
, danutil
.
- /receiver—Paket
receiver
berisi dua penerima siaran yang bernamaAlarmReceiver
danSnoozeReceiver
.AlarmReceiver
dipicu olehAlarmManager
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 danViewModel
.NotificationUtils.kt
memiliki metode ekstensi diNotificationManager
.
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.
- Buka class
NotificationUtils.kt
dan temukanTODO: Step 1.1
. Anda akan menemukan daftar tugas yang cocok dalam codelab ini dan kode aplikasi. - Periksa fungsi
sendNotification()
yang ditentukan. Anda akan memperluas fungsi ekstensi ini keNotificationManager
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) {
- 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)
)
- 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)
- Selanjutnya, Anda perlu memanggil
notify()
dengan ID unik untuk notifikasi Anda dan dengan objekNotification
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())
- Buka
ui/EggTimerViewModel.kt
dan temukan fungsistartTimer()
. Fungsi ini membuat alarm dengan interval waktu yang dipilih saat pengguna mengaktifkan timer telur. - Anda akan memicu notifikasi dalam fungsi ini saat pengguna memulai timer. Untuk memanggil fungsi
sendNotification()
yang sebelumnya Anda terapkan, Anda memerlukan instanceNotificationManager
.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 instanceNotificationManager
dari sistem. Panggil fungsisendNotification()|
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.
- Buka
logcat
dan telusuri"No Channel found"
. Anda akan melihat pesan error yang menyatakan bahwaegg_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.
- Buka
EggTimerFragment.kt
dan temukan fungsicreateChannel()
. - Teruskan ID saluran unik ke konstruktor
NotificationChannel
. - Teruskan nama saluran notifikasi, yang juga akan dilihat pengguna di layar Setelan mereka.
- Sebagai parameter terakhir, teruskan tingkat kepentingan untuk saluran notifikasi. Tingkat kepentingan akan dibahas nanti dalam codelab ini, jadi untuk saat ini Anda dapat menggunakan
NotificationManag
er.IMPORTANCE_LOW
. - Pada objek
notificationChannel
tetapkanenableLights
ke benar. Setelan ini akan mengaktifkan lampu saat notifikasi ditampilkan. - Pada objek
notificationChannel
setellightColor
ke merah untuk menampilkan lampu merah saat notifikasi ditampilkan. - Pada objek
notificationChannel
, tetapkanenableVibration
ke benar untuk mengaktifkan getaran. - Di objek
notificationChannel
, tetapkan deskripsi saluran ke‘Time for breakf
ast'. - Dapatkan instance
NotificationManager
dengan memanggilgetSystemService()
. - Panggil
createNotificationChannel()
diNotificationManager
dan teruskan objeknotificationChannel
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
}
- 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)
)
- 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)
)
- Jalankan aplikasi, dan Anda akan melihat aplikasi mengirim notifikasi setiap kali Anda memulai timer.
- Tarik status bar dan amati bahwa judul, konten, dan ikon notifikasi sama seperti yang Anda tetapkan di langkah sebelumnya.
- Untuk memverifikasi saluran yang baru dibuat, tutup aplikasi dan cari ikon aplikasi. Ketuk lama ikon aplikasi tersebut, lalu pilih Info aplikasi.
- 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.
- Buka
AlarmReceiver.kt
, instanceNotificationManager
, dan panggil fungsisendNotification()
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
)
- 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()
- 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.
- 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)
- Jalankan aplikasi Anda lagi.
- 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
- Jalankan kembali aplikasi, jika aplikasi belum berjalan.
- 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.
- Buka
NotificationUtils.kt
dan temukan fungsi ekstensisendNotification()
. - Buat
Intent
denganapplicationContext
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.
- Buat
PendingIntent
denganapplicationContext
,NOTIFICATION_ID
,contentIntent
yang Anda buat di langkah sebelumnya, dan flagPendingIntent
. FlagPendingIntent
menentukan opsi untuk membuatPendingIntent
baru atau menggunakan yang sudah ada. Anda harus menetapkanPendingIntent.FLAG_UPDATE_CURRENT
sebagai tanda karena Anda tidak ingin membuat notifikasi baru jika sudah ada notifikasi. Dengan cara ini Anda akan memodifikasiPendingIntent
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
)
- Teruskan
PendingIntent
ke notifikasi Anda. Anda dapat melakukannya dengan memanggilsetContentIntent()
diNotificationBuilder
. Sekarang, saat Anda mengklik notifikasi,PendingIntent
akan dipicu, membukaMainActivity
. - Tetapkan juga
setAutoCancel()
ketrue
, 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)
- Jalankan kembali aplikasi.
- Setel timer, letakkan aplikasi di latar belakang, dan tunggu hingga notifikasi muncul.
- 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
()
.
- Buka
NotificationsUtil.kt
. - Tambahkan fungsi ekstensi di
NotificationManager
yang memanggilcancelAll()
.
// NotificationUtils.kt
// TODO: Step 1.14 Cancel all notifications
/**
* Cancels all notifications.
*
*/
fun NotificationManager.cancelNotifications() {
cancelAll()
}
- Buka
EggTimerViewModel.kt
dan buka fungsistartTimer()
. - Di dalam
startTimer()
, Dapatkan instanceNotificationManager
dari sistem dan panggilcancelNotifications()
.
// EggTimerViewModel.kt
//TODO Step 1.15 call cancel notification
val notificationManager =
ContextCompat.getSystemService(
app,
NotificationManager::class.java
) as NotificationManager
notificationManager.cancelNotifications()
- Jalankan aplikasi dan mulai timer.
- 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.
- Buka
NotificationUtils.kt
dan temukan fungsisendNotification()
. - Mulai dengan memuat gambar dari
resources
menggunakanBitmapFactory
.
// NotificationUtils.kt
// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
applicationContext.resources,
R.drawable.cooked_egg
)
- Buat
BigPictureStyle
baru dan tetapkan gambar Anda. - Tetapkan
bigLargeIcon()
kenull
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)
- Setel gaya dengan
setStyle()
kebigPicStyle
. - Setel ikon besar dengan
setLargeIcon()
keeggImage
, 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)
- 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.
- Buka
SnoozeReceiver.kt
. Class ini mirip denganAlarmReceiver
yang Anda gunakan sebelumnya. Pada langkah berikut, Anda akan menambahkan kode yang akan memicu fungsionReceive()
dariSnoozeReceiver
. Singkatnya, kode dalamSnoozeReceiver
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()
- Untuk menggunakan
SnoozeReceiver
, bukaNotificationUtils.kt
. - Buat
Intent
snoozeIntent
baru untukSnoozeReceiver
tepat setelah gaya dalam fungsisendNotification()
. - Buat intent tertunda dengan memanggil metode
getBroadcast()
diPendingIntent
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. - Parameter pertama adalah konteks aplikasi tempat
PendingIntent
ini harus memulai aktivitas. - 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.
- Selanjutnya, tambahkan objek
snoozeIntent
, yang merupakan intent dari aktivitas yang akan diluncurkan. - 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
)
- Selanjutnya, panggil fungsi
addAction()
padanotificationBuilder
. Fungsi ini mengharapkan ikon dan teks untuk menjelaskan tindakan Anda kepada pengguna. Anda juga perlu menambahkansnoozeIntent
. Intent ini akan digunakan untuk memicuboadcastReceiver
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
)
- Jalankan aplikasi pengatur waktu untuk menguji tindakan tunda.
- 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) | ||
Berbunyi | ||
Tanpa suara | ||
Tidak ada bunyi dan tidak muncul di status bar. |
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
.
- Untuk mengubah tingkat kepentingan saluran notifikasi aplikasi Anda, buka
EggTimerFragment.kt
dan bukacreateChannel()
. Ubah tingkat kepentingan dariIMPORTANCE_LOW
menjadiIMPORTANCE_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
.
- 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)
- 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.
- 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.
- 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)
}
- 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.
- Gunakan class NotificationManager untuk membuat, mengirim, memperbarui, dan membatalkan notifikasi.
- Gunakan objek NotificationChannel dengan metode createNotificationChannel guna menetapkan saluran untuk notifikasi.
- Gunakan addAction() untuk menambahkan tindakan cepat ke notifikasi.
- Gunakan setShowBadge() untuk mengaktifkan atau menonaktifkan badge.
- Beri gaya notifikasi menggunakan gaya yang diperluas dari Notification.Style
- Menetapkan tingkat nilai penting dengan NotificationChannel.setTingkatPenting
Kursus Udacity:
Dokumentasi developer Android:
Untuk link ke codelab lainnya dalam kursus ini, lihat halaman landing codelab Android Lanjutan di Kotlin.