2-) Android’de Bildirimler (Notifications)

Tolga Pirim
5 min readJun 9, 2023

--

Bu yazımda bir bildirim, kanal (channel) nasıl oluşturulur. Oluşturduğumuz bildirimi kullanıcıya nasıl gösterebiliriz, gösterdiğimiz bildirimi güncellemeyi ve iptal etmeyi ve kilit ekranından bildirimde görünen ayrıntı düzeyini nasıl kontrol edildiğini anlatacağım.

Photo by Brett Jordan on Unsplash

Bildirim Oluşturmak

En temel ve kompakt haliyle her bildirim bir simge, bir başlık ve az miktarda içerik metni görüntüler. Bu bölümde, kullanıcının uygulamanızdaki bir etkinliği başlatmak için tıklayabileceği bir bildirimi nasıl oluşturacağınızı öğreneceksiniz.

Bildirim İçeriğini Ayarlama

Bir bildirimin içeriğini ve kanalını ayarlamak için NotificationCompat.Builder() nesnesini kullanabilirsiniz.

İşte adım adım yapılacak işlemler:

  1. Küçük İkon (Small Icon) ayarlama: Bir bildirimde görünecek küçük bir simge belirlemek için setSmallIcon() yöntemini kullanabilirsiniz. Bu simge, genellikle uygulamanızın logosu olur.
 val builder = NotificationCompat.Builder(context,"channelId")
.setSmallIcon(R.drawable.sport_icon);

2. Başlık (Title) ve İçerik Metni (Body Text) ayarlama: Bildirimde görünecek başlık ve içerik metnini setContentTitle() ve setContentText() yöntemlerini kullanarak ayarlayabilirsiniz. Örneğin:

 val builder = NotificationCompat.Builder(context,"channelId")
.setSmallIcon(R.drawable.sport_icon)
.setContentTitle("Spor Bildirimleri")
.setContentText("Nba finallerinde Denver Nuggets ve Miami Heat.");

3. Bildirim Önceliği (Notification Priority) ayarlama: Bir bildirimin önceliğini belirlemek için setPriority() yöntemini kullanabilirsiniz. Bu öncelik, bildirimin Android 7.1 (Android 8.0 için bunun yerine ileride göstereceğim kanal önemini (channel importance) ayarlamamız gerekiyor)

val builder = NotificationCompat.Builder(context, "channelId")
.setSmallIcon(R.drawable.sport_icon)
.setContentTitle("Spor Bildirimleri")
.setContentText("Nba finallerinde Denver Nuggets ve Miami Heat.")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)

Android 8.0 (API seviyesi 26) ve üzeri sürümler için bildirimler oluştururken bir kanal kimliği(channelId) sağlamanız gerekmektedir.

Kanal (Channel) Oluşturmak

Android 8.0 (API level 26)’dan itibaren tüm bildirimler bir kanala dahil edilmelidir. Aksi taktirde bildirimler görünmezler. Aşağıdaki kod örneği, SDK_INT sürümüne göre bildirim kanalını sisteme kaydetmenin nasıl yapılacağını göstermektedir:

private fun createNotificationChannel(context: Context) {
// Sadece API 26+ için NotificationChannel oluşturun
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = "Spor Bildirimleri"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel("channelId", name, importance)

// Sisteme kanalı (channel) kaydedin
val notificationManager: NotificationManager =
context.getSystemService(NotificationManager::class.java) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}

Oluşturduğumuz channel’i kullanıcılar uygulama ayarlarından görebilir ve her bir channel için ayarlamalar yapabilirler.

Bildirimi Göstermek

Bir bildirimi göstermek için NotificationManagerCompat.from(context).notify()yöntemini kullanmamız gerekmektedir. Bu yöntem, iki parametre alır. İlk olarak, her bir bildirim için benzersiz bir kimlik değeri iletmeliyiz. İkinci parametre ise bir Notification nesnesidir, bu nesneyi oluşturmak için yukarıda belirtildiği gibi bir NotificationCompat.Builder nesnesini kullanabiliriz.

Yukarıdaki bildirim içeriğini ayarlama bölümünde, builder değişkenini kullanarak bir NotificationCompat.Builder nesnesi oluşturduk ve istediğimiz bildirim için ayarlamaları yaptık. Bu ayarlamaları tamamladıktan sonra, build() fonksiyonunu kullanarak bir Notification nesnesi oluşturduk.

// 1 ile belirttiğimiz alan her bir bildirim için benzersiz bir id değeri
NotificationManagerCompat.from(context).notify(1, builder.build())

Bildirimi Güncelleme ve Daha Uzun Mesajlar Gösterme

NotificationManagerCompat.from(context)
.notify(1, builder
.setContentText("Nba finallerinde Denver Nuggets ve Miami Heat karşılaşacak")
.setStyle(NotificationCompat.BigTextStyle()
.bigText("Nba finallerinde Denver Nuggets ve Miami Heat karşılaşacak. Denver'de dikkat çeken oyuncu Nikola Jokic, Miami tarafında dikkat çeken oyuncu Jimmy Butler")
).build()
)

Bir bildirimi gösterdikten sonra güncellemek için, NotificationManagerCompat().notify()işlevini tekrar çağırın ve daha önce kullandığınız aynı ID’ye sahip bir bildirim iletin. Bildiriminizin daha uzun bir text içermesini istiyorsanız, setStyle() ile bir stil şablonu ekleyerek genişletilebilir bir bildirimi etkinleştirebilirsiniz.

Bildirimi Silmek

Bir bildirimi silmek için NotificationManagerCompat().cancel(id) methodunu kullanarak silebiliriz.

 NotificationManagerCompat.from(context).cancel(1)

Bir bildirimi yukarıda olduğu gibi manuel olarak silebiliriz, ama istersek bir bildirimi silmek için, bildirim oluştururken setTimeOutAfter() methodunu kullanarak bir zaman aşımı ayarlarsanız, belirtilen süre geçtikten sonra sistem bildirimi iptal eder. Aşağıdaki örnekte sistem bildirim gösterildikten 3 saniye sonra bildirimi otomatik olarak siler.

 val builder = NotificationCompat.Builder(context, "channelId")
.setSmallIcon(R.drawable.sport_icon)
.setContentTitle("Spor Bildirimleri")
.setContentText("Nba finallerinde Denver Nuggets ve Miami Heat.")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setTimeoutAfter(3000)

Bildirimin Kilit Ekranından Görünürlüğünü Ayarlama

Kilit ekranındaki bildirimlerin görünürlüğünü ayarlamak için bildirim oluştururken setVisibility() methodunu kullanarak ayarlayabiliriz. Temelde 3 adet ayarlayabileceğimiz ayar bulunuyor.

  • VISIBILITY_PUBLIC Bildirimin tam içeriğini gösterir.
  • VISIBILITY_SECRET Bildirim hiçbir şekilde kilit ekranında gösterilmez.
  • VISIBILTY_PRIVATE Bildirimin sadece belirli kısımlarını gösterir. Bunlar bildirim için kullandığımız icon ve setContentTitle() fonksiyonu ile belirttiğimiz bölümler gösterilir.

Şimdi her biri için örneklere bakalım.

VISIBILITY_PUBLIC

VISIBILITY_PRIVATE

Bu özelliği kullandığımızda bildirimin kilit ekranında göstermek istediğimiz bir versiyonunu da iletebiliriz. setPublicVersion() methodunu kullanarak istediğimiz yeni bir Notification nesnesini oluşturabiliriz. Örnek olarak;

val builder = NotificationCompat.Builder(context, "channelId")
.setSmallIcon(R.drawable.sport_icon)
.setContentTitle("Spor Bildirimleri")
.setContentText("Nba finallerinde Denver Nuggets ve Miami Heat.")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setVisibility(NotificationCompat.VISIBILITY_PRIVATE)
.setPublicVersion(
NotificationCompat.Builder(context, "channelId")
.setSmallIcon(R.drawable.sport_icon)
.setContentTitle("Spor Bildirimleri")
.setContentText("Nba finallerine kalan takımlar belli oldu.")
.build()
)

VISIBILITY_SECRET

Android Bildirimleriyle İlgili Intent ve PendingIntent Kullanımı

Kullanıcıyı ilgili activity’e yönlendirmek için Intent ve PendingIntent kullanılır. Bu bölümde, Android uygulamalarında bildirimlerle ilişkili olarak kullanılan bir Intent ve PendingIntent örneğini inceleyeceğiz.

Öncelikle, Intent sınıfı, uygulamanın farklı bileşenlerini başlatmak veya birbiriyle iletişim kurmak için kullanılır. Bildirimlerde, genellikle Intent kullanılarak kullanıcının tıkladığı veya bildirime yanıt verdiği zaman açılacak olan bir activity başlatılır. İşte bu durumu sağlamak için kullanılan bir Intent örneği:

val intent = Intent(context, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

Yukarıdaki kod parçasında, Intent sınıfının bir örneği oluşturuluyor. MainActivity başlatılacak olan activity sınıfını temsil eder. flags özelliği, Intent nesnesinin davranışını belirlemek için kullanılır.

Bildirimlerde, Intent nesnesi bir PendingIntent içinde kullanılır. PendingIntent, başka bir zaman veya başka bir bileşen tarafından kullanılabilen bir Intenti temsil eder. İşte yukarıdaki Intent örneğiyle ilişkilendirilmiş bir PendingIntent örneği:

val pendingIntent = PendingIntent.getActivity(
context,
0,
intent,
PendingIntent.FLAG_IMMUTABLE
)

Ve son olarak oluşturduğumuz PendingIntent nesnesini Notification nesnemize bildirmemiz gerekiyor. Bu işlemi setContentIntent() methodunu kullanarak yapabiliriz.

 val builder = NotificationCompat.Builder(context, "channelId")
.setSmallIcon(R.drawable.sport_icon)
.setContentTitle("Spor Bildirimleri")
.setContentText("Nba finallerinde Denver Nuggets ve Miami Heat.")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)

Ve işte PendingIntent kullanarak oluşturduğumuz işlem için örnek:

Yaptığımız uygulamanın bütün kodları:

Özet

Bu makalede Android’de bildirimlerle ilgili temel konuları ele aldık ve bildirim oluşturma, güncelleme, iptal etme ve kilit ekranında görünürlük ayarlama gibi işlemleri adım adım öğrendik. Umarım bu makale, Android bildirimlerini anlamanıza ve uygulamanızda etkili bir şekilde kullanmanıza yardımcı olmuştur. Bir sonraki yazıda, bildirimlere aksiyon alabilmemiz için oluşturabildiğimiz action button’ları nasıl oluşturacağımızı anlatacağım. Görüşmek Üzere 👋

Diğer sosyal medya hesaplarımda takip etmek isterseniz:

Linkedin: https://www.linkedin.com/in/tolga-pirim-7b0b10168/

GitHub: https://github.com/tolgaprm

Twitter: https://twitter.com/tlgprm38

--

--