Merhaba Arkadaşlar,
Mobilhanem.com sitemiz üzerinden anlattığımız / yayınladığımız Android Dersleri’mize bu dersimizde Android 8 Oreo ile birlikte ortaya çıkan , Target Sdk’sı 26 üzerinde geliştirme yapan ve Notification Özelliğini kullanan herkesin kullanması gereken bir yapı olan Notification Channel hakkında bir yazı yazacağım.
Android Notification Channel Nedir ?
Notification Channel Android 8 Oreo ile birlikte android’in bizlere sunduğu yeni bir özelliktir. Artık uygulamamıza gelen Push Notification ve ya Local Notificationları gruplayabileceğiz ve notification ayarlarını,kullanıcının bu gruplara göre ayrı ayrı ayarlamasına Uygulama Ayarları sayfasından izin verebileceğiz. Aşağıda videoyu paylaşıyorum.
Yukarıdaki video’dan gördüğünüz gibi Mobilhanem Dersleri adında notification channel oluşturduk ve notification ayarlarını uygulama ayarları sayfasından değiştirebildik. Uygulama ayarları sayfasından ilgili notification channel için , notification’ı açıp kapama , sesi değiştirme , titreşimi açıp kapama , önceliği ve rahatsız etme iznini iptal edebilme özelliklerini kullanıcıya bırakıyoruz.
Notification Channel Artıları
1 – Bir uygulamada birden fazla channel yaratabilirsiniz. Böylelikle kullanıcı tüm notificationları kapatmak yerine istemediği channel’ı kapatabilir. Örneğin elinizde bir Spor Haberleri uygulaması olduğunu varsayalım ve her bir takım için bir channel oluşturulduğunu düşünelim. Ben kullanıcı olarak sadece Galatasaray Channel’ına izin verip diğerlerini kapatabilirim. Böylelikle diğer takımların notification’ını almamış olurum. Bu anlattığım kullanıcı açısından faydası , biz uygulama sahiplerine veya geliştiricilerine faydası ise notificationlardan sıkılan biri tüm notificationları kapatmak yerine ilgili notificationları açık bırakabilir.
2 – Notification sesini istediği gibi , istediği channel için ayarlayabilir.
3- Titreşimi istediği gibi , istediği channel için ayarlayabilir.
4 – Önem sırasını değiştirebilir.
5 – Kilit ekranında gözüküp gözükmeyeceğini belirleyebilir.
6 – Ekran ışığını açıp açmayacağını ayarlabilir.
7 – Gelen notification’ın Beni Rahatsız Etme özelliğini iptal edip edemeyeceğini ayarlayabilir.
Notification Channel’ı kullanmak zorundamıyız ?
Bunu açıklamaya başlamadan önce yaşadığım durumu sizlere anlatayım. Geliştirmekte olduğum projelerde her zaman Compile SDK mı ve Target SDK’mı en son çıkan android sürümüne set ederim(şuan 27). Bunun doğru mu yanlış mı olduğu başka bir blog yazısı olabilir ama bunu yapmaktaki temel hedefim , android’in yeni çıkardığı özellikleri projemde kullanmak isteyişimdir.
Örneğin Android 8 ile birlikte artık text fontunu XML’den ayarlayabiliyoruz. (Bununla ilgili bir yazı hazırlığımız mevcut) Bundan öncesinde bunu yapabilmek için 3.rd parti kütüphaneler kullanıyorduk. Bizde projemizde 3.rd parti kütüphane kullanmıştık. TextView , EditText ve Button gibi yapılardaki textleri kullanmış olduğumuz RobotoTextview kütüphanesi ile fontlarını değiştirmiştik.
Ancak Android 8 Oreo ile birlikte herhangi bir kütüphane kullanmadan native android sdk’sı ile bunu yapma imkanı bulduk. Hatta Support Library kütüphanesi ile Android 4’e (SDK 14) kadar bu desteği bize sundu. Yani minimum sdk’nız 14 ve üzeri ise artık projelerinizde fontu direk xml’den set edebileceksiniz. Bende projemde 3.rd parti kütüphaneyi kaldırdım ve native özelliği kullanmaya başladım. Zaten paylaşmış olduğum RobotoTextview kütüphanesinin github sayfasına giderseniz kütüphanenin Android 8 Oreo ile birlikte deprecate olduğunu görebilirsiniz.
Peki ben bunu neden anlattım 🙂 İşte bu ve bunun gibi yeni özelliklerden dolayı her zaman Target SDK ve Compile SDK’mı son sürüme çekerim. Ama bu sefer ummadığım bir durumla karşılaştım. Yeni update çıktığım zaman Android 8 ve üzerindekilerin Push Notification alamadığı gerçeğiyle yüzleştim (Android 8 kullanıcıları %0.5 in altında olmasına rağmen). Herhangi bir Crash durumu söz konusu değildi fakat notification alamıyorlardı. Hemen rollback yapıp Google Play Sürüm yönetiminden eski apk’yı devreye aldım ve konuyu araştırmaya başladım.
Araştırınca sebebini bulmam uzun sürmedi , target SDK’mızı 26 ve üzeri yaptığımız an artık Notification Channel kullanmak zorundayız. Kullanmadığımız durumda notification’ımız çalışmıyordu. Eee o zaman sürümümü 26 ve üzeri yapmam sorunla karşılaşmam diyenleri duydum. Nereye kadar kaçabilirsiniz ki , geliştirdiğiniz uygulama eğer kurumsal bir uygulama ise elbette ilerleyen bir zamanda target sdk’nızı 26 üzerine çıkarmak zorunda kalacaksınız. Dolayısıyla şuan zamanınız varken , işler sıkışmamışken acil bir durum yokken bu yapıya sizde rahat rahat geçin 🙂
Notification Channel’ı Tanımlamak
Direk kodunu paylaşıyorum arkadaşlar.
String CHANNEL_ID = "mobilhanem"; String CHANNEL_NAME = "Mobilhanem Dersleri" NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.enableVibration(true); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE) manager.createNotificationChannel(channel);
Her bir channel’in bir id’si ve kullanıcını göreceği bir adı olmalıdır. Yukarıda biz id’yi “mobilhanem” olarak set ettik. Adı’nı ise “Mobilhanem Dersleri” verdik. Channel oluşturduktan sonra channel.enableVibration(true);
diyerek channel için başlangıç titreşim ayarını açtık.
Channel oluştururken enableVibration() gibi farklı methodlarıda kullanarak default başlangıç değerini değiştirebiliriz.
Birkaç örnek paylaşıyorum:
channel.enableLights() //Cihaz destekliyorsa flaş açıp kapamaya izin verir. true ve ya false değer alır channel.enableVibration // titreşim açık mı olsun kapalı mı olsun.true veya false değer alır channel.setVibrationPattern() //titreşim patternini ayarlayabilirsiniz channel.setImportance() //Notification önemini set edebilirsiniz. Detaylı bilgi için tıklayınız. channel.setSound() //Notification'ın sesini istediğiniz gibi ayarlayabilirsiniz. channel.setBypassDnd() //Rahatsız etme iznini iptal edebilsin mi . true ve ya false channel.canShowBadge() //Notification geldiğinde uygulama ikonuna işaret bıraksın mı. true ve ya false
Yukarıdaki methodlarla notification channel için başlangıç değerleri atamış olduk. Kullanıcı isterse bunları Bildirim ayarlarından istediği gibi değiştirebilir.
ÖNEMLİ NOT: Bu ayarları sadece notification channel ilk oluştururken ayarlayabiliriz. Channel oluştuktan sonra artık biz uygulama içinden bu ayarları değiştiremeyiz. Sadece kullanıcının ayarlarını okuyabiliriz. Tekrardan yazmak istiyorum 🙂 Channel oluştuktan sonra bu ayarları uygulama içinden değiştiremeyiz.
Notification Göndermek
Bizim bu yazımızın konusu Push notification olmadığı için local notification göndereceğiz. Firebase’le Push Notification Göndermek isterseniz bu dersimizi inceleyebilirsiniz.
Kod:
String CHANNEL_ID = "mobilhanem"; int NOTIFICATION_ID = 52;//Notification id si, channel ile ilgisi bulunmuyor Notification notification = new Notification.Builder(this, CHANNEL_ID) .setContentTitle("Mobilhanem Notification Channel") .setContentText("Example Text") .setSmallIcon(R.drawable.ic_launcher_round) .setAutoCancel(true) .build(); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(NOTIFICATION_ID, notification);
Yukarıda Notification’ı oluştururken Builder constructor’ına CHANNEL_ID’mizi gönderiyoruz ki , gelen notification’ın hangi channel’a ait olduğunu bilsin. Siz Push notification ile çalışıyor olsaydınız bu id’yi notification’ı gönderirken gönderebilirsiniz.
Peki Channel oluşturmadan notification göndersek ne olacaktı. Bir Crash’e sebep olmuyor ama notification’da gözükmüyor.
Notification Channel Silmek
Kullanıcı ayarlar sayfasından Notification Channel’ı silemiyor. Biz uygulama içinden aşağıdaki kod ile silebiliyoruz.
String CHANNEL_ID = "mobilhanem"; NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.deleteNotificationChannel(CHANNEL_ID);
Yine gördüğünüz gibi channel_id mizi vererek Channel’ımızı silebiliyoruz.
Özet:
Ben bununla ilgili örnek basit bir uygulama yaptım. Yukarıdaki videonun kodlarını aşağıda paylaşıyorum. Sizlere de kodları indirerek incelemenizi tavsiye ederim.
Android Notification Channel
Android Notification Channel Tanımlama Ve Kullanımı anlattığımız dersimizin sonuna geldik. Umarım sizler için yararlı olmuştur. Konu hakkında soru , görüş ve yorumlarını konu altından ve ya SoruCevap sitemizden sorabilirsiniz.
Sıfırdan Android derslerimiz için tıklayınız.
6
Teşekkürler hocam, spor haberleri örneğinden sonra iyice oturuyor konu.
Yorum için teşekkürler.
Hocam merhabalar , firebase ile yolladığım bildirimlerin uygulamada yedeklemesin ve kullanıcı bildirimleri daha sonra görmek istediğinde açıp bakması için nasıl bir yol izleyebilirim?
Yedeklenmesi için yazacaktım yedeklemesin diye hatalı yazdım.
Gelen push notificationları SharedPreferences veya sqlite kullanarak önce kaydedebilirsin. Burda tavsiyem sqlite kullanman. Çünkü zamanınıda ekleyebilirsin sqlite.
Sonra listeleme sayfasında bunları gösterebilirsin. Sen ne kadarını yaptın nerede takıldın ?
Hocam Gelen bildirimi bir mesaj kutucuğunda uygulamayı açınca kullanıcıya okutma imkanı nasıl olur. Teşekkürler
Pending intent ile farklı bir activity açtırıp onun içinde okutabilirsin.
Çok sağol hocam kralsın
[…] ile birlikte hayatımıza giren notification channel ( daha detaylı bilgi için bu dersimizi inceleyebilirsiniz. ) yeni özellikler […]
Şimdi hocam basit bir soru api 27 seviyesi ve 27 seviyesi altı için atıyorum 14 apiye kadar notification göndermek istiyorum ikisi birlikte nasıl olucak
apiLevel > 27 den notification channel değilse eski yöntem
Merhaba,
Push notification yapmak istiyorum ancak nasıl yapabilirim bilmiyorum. Bilgi verebilir misiniz? Firebase kullandım ancak benden bu servisi kendi bilgisayarımda oluşturmam istendi. Neleri araştırmam gerekiyor?
Merhaba,
Push notification yapmak istiyorum ancak nasıl yapabilirim bilmiyorum. Bilgi verebilir misiniz? Firebase kullandım ancak benden bu servisi kendi bilgisayarımda oluşturmam istendi.Neleri araştırmam gerekiyor?
https://www.mobilhanem.com/android-firebase-cloud-messaging-ile-push-notification-gondermek/
Merhaba,
Android oreo sürümün de token bilgisi alamıyorum
daha önceden
FirebaseInstanceId.getInstance().GetToken() diye alabiliyorken şimdi
oreo için malesef alamıyorum
yardımcı olursanız sevinirim.
Android oreo ile birlikte background service olaylarıda değişti. Service yerine JobService yada FirebaseJobService kullanman gerekir.
Merhabalar, android’de API 26 ve üzeri sürümlerde NotificationChannel kullanarak bildirimleri kategorize ederek açıp kapatabiliyoruz. Bana lazım olan API 26 ve altındaki sürümlerde bu işlemi yapmak.
Örneğin Hadi Bilgi Yarışması’nda Channel tanımlanmamış ancak uygulamanın içerisinden bildirim gelmesini istediğim yarışma kategorisini seçebiliyorum. Uygulamanın bildirim ayarlarında bu kanallar gözükmüyor. Bu sayede tüm sürümler için de bildirimler özelleştirilebiliyor. Yardımcı olabilir misiniz?
Bunu backend ile birlikte yapabilirsin. Bildirim gelmesini ve ya gelmemesini istediğin channel için uygulama içinden kullanıcı açıp kapattığında backend e bu bilgiyi gönderir backend de kullanıcının seçimine göre push atar ve ya atmaz.
Angular da bir proje geliştiriyorum. web projesini android studio ya web olarak gömeceğim. mobil de notificationları sizce nasıl yapmalıyım. yani bildirimler telefonun yukardaki bara düşürmek istiyorum.
String NOTIFICATION_ID = 52 olmaz
int NOTIFICATION_ID = 52 olmalı
Merhaba uygulamada küçük bir hata var paket ayrıştırma hatası veriyor target sdk versiyon 26 minik versiyon 26 olduğu için paket hatası veriyor minisdk 14 yaparsanız hata düzeliyor. Teşekkür ederim. Bu arada yeniyim bildirim bir türlü çalıştıramadım. Bu kodları deneyecem inşallah bildirim çalışır target sdk 27 ile çalışıyorum.