Menampilkan Notifikasi di Android 13
Notifikasi merupakan sebuah cara bagi suatu aplikasi untuk menginformasikan pengguna tentang event yang terjadi ketika aplikasi sedang tidak dibuka. Contoh event seperti pesan masuk ketika aplikasi sedang ditutup, pengumuman terkait fitur tertentu, perkiraan cuaca baru dan lain sebagainya. Artikel ini akan membahas cara menggunakan dan menampilkan notifikasi di Android dengan Kotlin.
Meminta Ijin Menampilkan Notifikasi #
Mulai dari Android 13, sebelum bisa menampilkan notifikasi kita harus meminta runtime permission terlebih dahulu. Pertama, kita siapkan dulu method untuk memeriksa apakah aplikasi sudah mendapatkan ijin, bila belum maka tampilkan popup-nya. Bila ijin ditolak, maka tampilkan snackbar untuk membuka halaman Settings dan mengijinkan permission Notification secara manual.
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
Snackbar.make(findViewById(R.id.main), "Notifications permission granted", Snackbar.LENGTH_SHORT)
.show()
} else {
Snackbar.make(
findViewById(R.id.main),
"${getString(R.string.app_name)} can't post notifications without Notification permission",
Snackbar.LENGTH_INDEFINITE
).setAction("Open Settings") {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val settingsIntent: Intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
startActivity(settingsIntent)
}
}.show()
}
}
private fun askNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) ==
PackageManager.PERMISSION_GRANTED
) {
// Lakukan sesuatu bila permission allowed
} else {
// Meminta ijin pengguna untuk menampilkan notification
requestPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
}
}
}
Panggil method askNotificationPermission()
di method onCreate()
.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
askNotificationPermission()
// kode-kode yang lain
}
Bila tidak user memilih jangan izinkan, maka user harus mengijinkannya lewat menu Settings.
Notification Channel #
Pada sistem Android sebelum Nougat, semua notifikasi dari satu aplikasi berada pada level yang sama. Ketika user memutuskan untuk tidak memperbolehkan suatu notifikasi, maka semua notifikasi tidak akan muncul. Pada versi Android yang baru sejak Nougat, diperkenalkan fitur bernama notification channel yang berfungsi untuk mengelompokkan notifikasi dari suatu aplikasi. Contoh untuk notifikasi iklan dibuat dengan channel sales, notifikasi percakapan dengan channel chat. dan lain-lain. Dengan begitu, bila kita tetap ingin menerima notifikasi terkait percakapan tapi tidak ingin menerima notifikasi dari penjualan, maka cukup matikan channel sales.
Selanjutnya, buat sebuah method untuk menampilkan notifikasi:
private fun showNotification() {
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
// 1
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && manager.getNotificationChannel(
"announcement"
) == null
) {
manager.createNotificationChannel(
NotificationChannel(
"announcement",
"Pengumuman", NotificationManager.IMPORTANCE_DEFAULT
)
)
}
// 2
val builder = NotificationCompat.Builder(this, "announcement")
builder
.setAutoCancel(true)
.setContentTitle("Pengumuman Aplikasi")
.setContentText("Aplikasi akan menjalani maintenance bulanan dan tidak dapat diakses selama 2 jam.")
.setSmallIcon(android.R.drawable.star_on)
// 3
val intent = Intent(this, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) // 4
builder.setContentIntent(pendingIntent)
// 5
manager.notify(212, builder.build())
}
- Kita periksa terlebih dahulu apakah sudah ada notification channel dengan id yang kita inginkan, dalam contoh ini adalah channel “announcement”. Jika belum ada maka buat channel baru.
- Berikutnya kita membuat objek notification builder baru dan mengatur:
- setAutoCancel: Bila true maka notifikasi akan hilang saat di klik
- setContentTitle: Mengatur judul notifikasi
- setContentText: Mengatur body notifikasi
- setSmallIcon: Mengatur icon yang akan tampil di tray notifikasi.
- Mengatur PendingIntent atau intent yang akan aktif ketika notifikasi di klik, pada contoh di atas kita akan membuka MainActivity.
- Untuk Android 12 ke atas, setiap pending intent wajib memiliki PendingIntent.FLAG_IMMUTABLE atau PendingIntent.FLAG_MUTABLE, jika tidak aplikasi akan crash.
- Meminta notification manager untuk menampilkan notifikasi.
Berikutnya panggil method showNotification()
pada tempat yang dibutuhkan. Contohnya di sini penulis menampilkan notifikasi saat sebuah button di klik.
val button = findViewById<Button>(R.id.showNotification)
button.setOnClickListener {
showNotification()
}
Tampilan notifikasi
Apabila pembaca membuka membuka halaman Info aplikasi (application info), pembaca bisa melihat semua channel yang dimiliki aplikasi tersebut diikuti engan sebuah switch untuk menonaktifkan channel tertentu.
Semoga artikel ini bermanfaat.