Bu codelab, Advanced Android in Kotlin kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla incelemeniz önerilir ancak bu zorunlu değildir. Kursla ilgili tüm codelab'ler Kotlin'de İleri Düzey Android codelab'leri açılış sayfasında listelenir.
Giriş
Bildirimler, kullanıcılara uygulamanızın kullanıcı arayüzü dışında gösterilen mesajlardır. Cihazın kilidi açıkken bildirimler ekranın üst kısmında, cihazın kilidi kapalıyken ise güvenlik ayarlarına bağlı olarak kilit ekranında gösterilir.
Normal bir bildirim; başlık, açıklama ve simgeden oluşur. Bildirimlerde tıklanabilir işlemler, hızlı yanıt, genişletilebilir içerik ve resimler de olabilir.
Bildirimler zamanında içerik sunabilir ve kullanıcının hızlı işlemler (ör. yanıt gönderme veya alarm erteleme) yapmasına olanak tanıyan düğmeler içerebilir. Bildirimi tıklayan kullanıcı, uygulamanızda bildirim içeriğiyle ilgili bir görünüme yönlendirilir.
Bildirimler, kullanıcıları önemli bir görev hakkında hatırlatmak, bir şey olduğunu bildirmek veya uygulamanız arka plandayken hemen ihtiyaç duydukları önemli bilgileri iletmek için kullanışlı bir yöntemdir. Bildirimleri dikkatli kullanın. Bu sayede hem kullanıcılara saygı göstermiş olursunuz hem de uygulamanızın bildiriminin hak ettiği ilgiyi görme olasılığı artar.
Bu codelab'de, Android uygulamasında bildirim oluşturmayı ve kullanmayı öğreneceksiniz.
Bilmeniz gerekenler
Aşağıdaki konular hakkında bilgi sahibi olmanız gerekir:
- Kotlin ile Android uygulamaları oluşturma Özellikle Android SDK ile çalışın.
- Mimari bileşenleri ve veri bağlamayı kullanarak uygulamaları nasıl tasarlayacağınızı öğrenin.
- BroadcastReceiver'lar hakkında temel bilgi
- AlarmManager hakkında temel bilgi
Neler öğreneceksiniz?
- Bildirim oluşturma, stilini belirleme ve gönderme
- Bildirimleri iptal etme
- Bildirim kanalları oluşturma
- Bildirimlere hızlı işlemler ekleme
- Uygulama simgesinde bildirim rozetleri nasıl gösterilir?
Yapacaklarınız
- Başlangıç uygulamasına bildirim ekleyin.
- Daha önce gönderdiğiniz bildirimi iptal edin.
- Farklı bildirim türleri için kanallar oluşturun.
- Başlangıç uygulamasındaki bildirimleri özelleştirin.
- Bildirimlerinizi etkileşimli hale getirmek için Hızlı İşlemler ekleyin.
- Bildirim rozetlerini devre dışı bırakın.
Yumurta pişirmek basit bir işlem olsa da süreyi takip etmezseniz zorlayıcı olabilir. Bu codelab'de yumurta zamanlayıcı uygulaması üzerinde çalışacak ve gelecekteki yumurtalarınız gibi mükemmel hale getireceksiniz. Kullanıcının farklı yumurta stilleri için farklı pişirme süresi ayarları belirlemesine olanak tanıyan, çalışan bir yumurta zamanlayıcı uygulamasıyla başlayacaksınız. Zamanlayıcı, seçilen zaman aralığından geri sayım yapar ve yumurtalar hazır olduğunda bir toast mesajı gösterir.
Bu işlevsel gibi görünse de mükemmel olmaktan uzaktır ve kullanıcı dostu değildir. Öncelikle, kısa süre gösterildiği için toast mesajını kaçırmak kolaydır. Ayrıca, uygulama ön planda değilse veya cihaz kilitliyse toast mesajı kaybolduktan sonra zamanlayıcının durumuyla ilgili görsel bir gösterge olmaz.
İdeal olarak, zamanlayıcı, kullanıcıları süre dolduğunda bildirimlerle bilgilendirmelidir. Kullanıcının yumurtaların hazır olduğunu hemen bilmesi gerekiyor, aksi takdirde yumurtalar fazla pişer. Bildirimler görseldir, ses içerebilir ve cihazın titreşmesini sağlayabilir. Bunların tümü, kullanıcının dikkatini çekmenin yollarıdır. Bu sayede mükemmel yumurtalar ve mutlu, iyi beslenmiş kullanıcılar elde edebilirsiniz.
Örnek uygulamayı edinmek için:
Depoyu GitHub'dan kopyalayın ve starter dalına geçin.
$ git clone https://github.com/googlecodelabs/android-kotlin-notifications
Alternatif olarak, depoyu Zip dosyası olarak indirebilir, dosyayı açıp Android Studio'da açabilirsiniz.
- Uygulamayı Android Studio'da açıp çalıştırın.
Yumurta resmi ve yumurtayı pişirmek için önceden tanımlanmış zaman aralıklarının listelendiği bir açılır menü görürsünüz. Az Pişmiş açılır menüsünün üçgenini tıklayın. Listedeki ilk seçenek test amaçlıdır ve alarmı yalnızca 10 saniyeye ayarlar. Listenin yanında, zamanlayıcıyı başlatan bir anahtar bulunur. Bu düğmeyi kullanarak yumurta zamanlayıcıyı istediğiniz zaman başlatabilir ve durdurabilirsiniz. Başlangıç kodu tam işlevlidir. Bu nedenle, yumurta zamanlayıcısını ayarlayabilir ve 0'a kadar geri sayım yapmasını izleyebilirsiniz. Zamanlayıcı tamamlandığında aşağıdaki gibi bir durum mesajı gösterilir.
- Kaynak kodu inceleyin. Başlangıç uygulaması,
MainActivity
adlı tek bir etkinlikten oluşur.receiver
,ui
veutil
adlı üç alt paket vardır.
- /receiver:
receiver
paketi,AlarmReceiver
veSnoozeReceiver
adlı iki yayın alıcısı içeriyor.AlarmReceiver
, kullanıcı tanımlı zamanlayıcı sona erdiğinde bildirimi göndermek içinAlarmManager
tarafından tetiklenir.SnoozeReceiver
, kullanıcının bildirimi erteleme tıklamasını işler. - /ui: Bu, uygulamanın kullanıcı arayüzü bölümünün bir parçası olan
EggTimerFragment
öğesini içerir.EggTimerViewModel
, zamanlayıcıyı başlatma ve iptal etmenin yanı sıra yaşam döngüsüyle ilgili diğer uygulama görevlerinden sorumludur. - /util: Bu pakette iki dosya var.
BindingUtils.kt
, uygulama kullanıcı arayüzü ileViewModel
arasında veri bağlamayı etkinleştirmek için bağlama bağdaştırıcılarına sahiptir.NotificationUtils.kt
,NotificationManager
üzerinde uzatma yöntemlerine sahiptir.
Bildirimler, kullanıcılarınızın dikkatini uygulamanıza çekmenin harika bir yoludur. Uygulamanız çalışmıyor olsa veya ön planda çalışıyor olsa da bildirimler ekranın üst kısmında bir pop-up pencere gösterir ve ses veya titreşim içerebilir. Bildirim oluşturmak için bildirim oluşturucu kullanmanız ve başlık metni, içerik metni ve simge sağlamanız gerekir. Oluşturucu gerekli tüm alanları doldurduktan sonra NotificationManager
(bir sistem hizmeti) bu içeriği bildirim olarak göstermenize yardımcı olur. NotificationManager
, bildirim göndermek, içeriğini güncellemek ve bildirimi iptal etmekten sorumludur. Aşağıdaki adımlarda NotificationManager
öğesine uzantı yöntemleri ekleyeceksiniz. Bu sayede, NotificationManager
kullanmanız gerektiğinde bu uzantı işlevlerini kullanarak ihtiyacınız olan işlevselliğe ulaşabilirsiniz.
1. adım: Temel bir bildirim oluşturun
Bu görevde yeni bir bildirim oluşturacak, kullanıcınız için bir mesaj ayarlayacak ve bildirimi göndereceksiniz.
NotificationUtils.kt
sınıfını açıpTODO: Step 1.1
simgesini bulun. Bu codelab'de ve uygulama kodunda eşleşen yapılacaklar listeleri bulacaksınız.- Belirtilen
sendNotification()
işlevini inceleyin. Bildirim göndermek için bu uzantı işleviniNotificationManager
'ya genişletiyorsunuz.
//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) {
- Bildirim oluşturucunun bir örneğini alın, uygulama bağlamını ve kanal kimliğini iletin. Kanal kimliği, kanalın dize değeridir.
Bildirim kanalları, bildirimleri gruplandırmanın bir yoludur. Geliştiriciler ve kullanıcılar, benzer bildirim türlerini gruplandırarak kanaldaki tüm bildirimleri kontrol edebilir. Bir kanal oluşturulduktan sonra, istenen sayıda bildirim göndermek için kullanılabilir.
//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)
)
- Bildirim simgesini uygulamanızı temsil edecek şekilde, başlığı ve kullanıcıya vermek istediğiniz mesajın içerik metnini ayarlayın. Codelab'de bildiriminizi daha fazla özelleştirmek için başka seçenekler de göreceksiniz. Ancak bildirim göndermek için ayarlamanız gereken minimum veri miktarı budur.
//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)
- Ardından, bildiriminize ait benzersiz bir kimlikle ve oluşturucunuzdaki
Notification
nesnesiylenotify()
işlevini çağırmanız gerekir.
Bu kimlik, mevcut bildirim örneğini temsil eder ve bu bildirimin güncellenmesi veya iptal edilmesi için gereklidir. Uygulamanızda belirli bir anda yalnızca bir etkin bildirim olacağından tüm bildirimleriniz için aynı kimliği kullanabilirsiniz. Bu amaçla NotificationUtils.kt
içinde NOTIFICATION_ID
adlı bir sabit zaten verilmiştir. Aramayı aynı sınıftaki bir uzantı işlevinden yaptığınız için doğrudan notify()
işlevini çağırabileceğinizi unutmayın.
//NotificationUtils.kt
// TODO: Step 1.4 call notify to send the notification
// Deliver the notification
notify(NOTIFICATION_ID, builder.build())
ui/EggTimerViewModel.kt
simgesini açıpstartTimer()
işlevini bulun. Bu işlev, kullanıcı zamanlayıcıyı etkinleştirdiğinde seçilen zaman aralığıyla bir alarm oluşturur.- Kullanıcı zamanlayıcıyı başlattığında bu işlevde bir bildirim tetiklersiniz. Daha önce uyguladığınız
sendNotification()
işlevini çağırmak içinNotificationManager
örneğine ihtiyacınız vardır.NotificationManager
, eklediğiniz uzantı işlevi de dahil olmak üzere bildirim API'si için kullanıma sunulan tüm işlevleri sağlayan bir sistem hizmetidir. Bir bildirimi göndermek, iptal etmek veya güncellemek istediğinizde sistemdenNotificationManager
örneği istemeniz gerekir. Bildirim mesajı ve bağlam ilesendNotification()|
işlevini çağırın.
// 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)
Neredeyse tamamlandı. Ancak uygulamanızı şimdi çalıştırıp zamanlayıcıyı ayarlarsanız bildirim almazsınız.
logcat
uygulamasını açıp"No Channel found"
ifadesini arayın.egg_channel
öğesinin mevcut olmadığını belirten bir hata mesajı görmeniz gerekir. Aşağıdaki adımlarda bildirim kanalları hakkında daha fazla bilgi edinecek ve bu sorunu düzelteceksiniz.
2. adım: Bildirim kanalları
API düzeyi 26'dan itibaren tüm bildirimlerin bir kanala atanması gerekir. Uygulama başlatıcı simgesine dokunup basılı tutarsanız, uygulama bilgilerini seçip bildirimlere dokunursanız uygulamayla ilişkili bildirim kanallarının listesini görürsünüz. Uygulamanız herhangi bir kanal oluşturmadığı için liste şu anda boş.
Kanallar, bildirimlerin "türünü" temsil eder. Örneğin, yumurta zamanlayıcınız yumurta piştiğinde bildirim gönderebilir ve kahvaltıda yumurta yemenizi hatırlatmak için günlük bildirimler göndermek üzere başka bir kanal kullanabilir. Bir kanaldaki tüm bildirimler birlikte gruplandırılır ve kullanıcılar, bildirim ayarlarını kanalın tamamı için yapılandırabilir. Bu sayede kullanıcılar, ilgilendikleri bildirim türüne göre bildirim ayarlarını kişiselleştirebilir. Örneğin, kullanıcılarınız kahvaltı bildirimlerini devre dışı bırakabilir ancak yine de zamanlayıcıdan gelen bildirimleri görmeyi tercih edebilir.
Geliştiriciler, bir kanaldaki tüm bildirimlere uygulanacak ilk ayarları, önemi ve davranışı belirler. İlk ayarları belirledikten sonra kullanıcılar bu ayarları geçersiz kılabilir.
1.1. adımda bildirim kanalınız olarak egg_notification_channel_id
kullandınız. Bu nedenle, şimdi bu kanalın bildirim ayarlarını ve davranışını oluşturup özelleştirmeniz gerekiyor.
EggTimerFragment.kt
simgesini açıpcreateChannel()
işlevini bulun.- Benzersiz kanal kimliğini
NotificationChannel
oluşturucusuna iletin. - Kullanıcıların Ayarlar ekranında da göreceği bildirim kanalı adını iletin.
- Son parametre olarak bildirim kanalının önem düzeyini iletin. Önem düzeyleri bu codelab'in ilerleyen bölümlerinde ele alınacaktır. Şimdilik
NotificationManag
er.IMPORTANCE_LOW
kullanabilirsiniz. notificationChannel
nesnesindeenableLights
özelliğini doğru olarak ayarlayın. Bu ayar, bildirim gösterildiğinde ışıkların yanmasını sağlar.- Bildirim gösterildiğinde kırmızı ışık görüntülemek için
notificationChannel
nesnesindelightColor
değerini kırmızı olarak ayarlayın. - Titreşimi etkinleştirmek için
notificationChannel
nesnesindeenableVibration
değerini true olarak ayarlayın. notificationChannel
nesnesinde kanal açıklamasını‘Time for breakf
ast' olarak ayarlayın.getSystemService()
numaralı telefonu arayarakNotificationManager
örneği edinin.-
createNotificationChannel()
işleviniNotificationManager
üzerinde çağırın ve önceki adımda oluşturduğunuznotificationChannel
nesnesini iletin.
//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
}
- Ardından, kanal oluşturmak için az önce yazdığınız
createChannel()
işlevini (1.7. adım) çağırmanız gerekir. Bu işlev, kanal kimliği ve kanal adı olmak üzere iki parametre alır. Projenizde zaten verilmiş olan dize kaynaklarından kanal kimliğinizi ve kanal adınızı aramanız gerekir.
// EggTimerFragment.kt
// TODO: Step 1.7 call createChannel
createChannel(
getString(R.string.egg_notification_channel_id),
getString(R.string.egg_notification_channel_name)
)
- Kanal kimliğini bildirim oluşturucuya iletmeniz gerekir. Bu işlemi 1.2. adımda zaten yaptınız. Kanal kimliği olarak yanlış bir değer ayarlarsanız bildirim gönderilemez. Daha önce ayarladığınız kanal kimliğinin doğru olduğunu doğrulamak için
NotificationUtils.kt
adresini açın.
// NotificationUtils.kt
val builder = NotificationCompat.Builder(
applicationContext,
// TODO: Step 1.8 verify the notification channel name
applicationContext.getString(R.string.egg_notification_channel_id)
)
- Uygulamayı çalıştırın. Zamanlayıcıyı her başlattığınızda uygulamanın bildirim gönderdiğini görürsünüz.
- Durum çubuğunu çekin ve bildirim başlığının, içeriğinin ve simgesinin önceki adımlarda ayarladığınız gibi olduğunu görün.
- Yeni oluşturulan kanalı doğrulamak için uygulamayı kapatıp uygulama simgesini bulun. Uygulama simgesine uzun basın ve Uygulama bilgileri'ni seçin.
- Ayarlar listesinden Bildirimler'i seçin. Bildirimleri göster ayarının hemen altında Egg adlı yeni bir kanal görürsünüz.
Uygulamayı çalıştırdığınızda bildirim gösterilir. Hem uygulama geliştirici olarak siz hem de kullanıcılarınız, bu kanalda gönderilen tüm bildirimlerin ayarlarını ve davranışını özelleştirebilir. Tebrikler, bildirim oluşturdunuz.
3. adım: Uygulamanıza bildirim ekleyin
Şimdiye kadar bildirim API'sinin temel kullanımı gösterildi ancak zamanlayıcıyı başlattıktan hemen sonra bildirim göndermek pek mantıklı değil. Kullanıcılar, yumurta hazır olduğunda bildirim almayı tercih edebilir. Bu codelab'in sonraki bölümünde bu sorunu düzeltecek ve kısa mesajı bildirime dönüştüreceksiniz.
Bildirimi zaten gönderdiniz ve kullanıcılara nasıl gösterildiğini gözlemlediniz. Ancak bu, harika bildirimler oluşturmanın yalnızca ilk adımıydı. Bu adımda, bildiriminizi daha uygun bir zamanda gönderilecek şekilde değiştireceksiniz.
Uygulamanız, alarm kurmak için AlarmManager
kullanıyor. AlarmManager
ile ilgili kod, başlangıç kodunda zaten verilmiş ve kısa mesajı göstermek için kullanılmıştır. AlarmManager
, istenen zaman seçimini takip eder ve süre dolduğunda AlarmReceiver.kt
'nin onReceive()
işlevini tetikler. AlarmReceiver.kt
simgesini açıp onReceive()
seçeneğine giderseniz her zaman yumurta zamanlayıcı ayarladığınızda gösterilen kısa mesajı görürsünüz.
AlarmReceiver.kt
,NotificationManager
örneğini açın vesendNotification()
işlevini mesaj metni ve bağlam parametreleriyle çağırın.
// 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
)
- İsteğe bağlı olarak, zamanlayıcı dolduğunda uygulamanız bildirim göndereceğinden kısa bildirimi kaldırın.
// AlarmReceiver.kt
// TODO: Step 1.10 [Optional] remove toast
// Toast.makeText(
// context,
// context.getText(R.string.eggs_ready),
// Toast.LENGTH_SHORT
// ).show()
- Uygulamanızı çalıştırın . Zamanlayıcıyı her başlattığınızda ve zamanlayıcı süresi dolduğunda bildirim görürsünüz.
Bu ideal bir durum değildir. Kullanıcılarınıza çok fazla bildirim göndermek istemiyorsanız. Kullanıcı zamanlayıcıyı başlattığında gönderilen ilk bildirimi kaldırabilirsiniz.
EggTimerFragment.kt
dosyasını açın ve 1.5. adımın bildirim kodunu kaldırın.
// 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)
- Uygulamanızı tekrar çalıştırın.
- Zamanlayıcıyı ayarlayın, arka plana alın ve sürenin dolmasını bekleyin. Bir bildirim görürsünüz. Bu bildirim çok daha faydalıdır.
4. adım: İçerik amacı ekleyin
- Henüz çalışmıyorsa uygulamayı tekrar çalıştırın.
- Bildirimi tıklayın. Hiçbir şey olmaz.
Bildirimi göstermek ve kullanıcıyı bilgilendirmek harika bir yöntemdir ancak kullanıcılar bir bildirimi tıkladığında ilgili uygulamaya geri dönmeyi bekler. Bu codelab'in bu bölümünde, kullanıcıyı zamanlayıcı ekranına geri getirmek için bildiriminize bir amaç ekleyeceksiniz.
Intent
, başka bir uygulama bileşeninden işlem isteğinde bulunmak için kullanabileceğiniz bir mesajlaşma nesnesidir. Intent'ler, etkinlik veya hizmet başlatmak ya da yayın yapmak için kullanılabilir. Bu durumda, kullanıcı bildirime dokunduğunda sistemi MainActivity
uygulamasını açmaya yönlendirmek için bu amaca yönelik işlemi kullanırsınız. Uygulamanız yalnızca tek bir görünümden oluştuğu için burada fazla seçeneğiniz yoktur. Ancak daha büyük bir uygulamada, bildirim, kullanıcıyı bildirimle etkileşime girdiğinde anlamlı bir ekrana getirerek sorunsuz bir deneyim oluşturmalıdır.
NotificationUtils.kt
dosyasını açın vesendNotification()
uzantı işlevini bulun.Intent
ileapplicationContext
ve başlatılacak etkinlikMainActivity::class.java
ile ilgili birIntent
oluşturun.
// 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)
Amacı oluşturdunuz ancak bildirim uygulamanızın dışında gösteriliyor. Amacın uygulamanızın dışında çalışması için yeni bir PendingIntent
oluşturmanız gerekir.
PendingIntent
başka bir uygulamaya veya sisteme, uygulamanız adına işlem yapma hakkı veriyorsa Bir PendingIntent
, yalnızca sistemi tarafından tutulan ve onu almak için kullanılan orijinal verileri açıklayan bir jetona yapılan referanstır. Bu, PendingIntent
'nın sahibi olan uygulamanın işlemi sonlandırılsa bile PendingIntent
'nın, kendisine verilen diğer işlemlerden kullanılabilir olmaya devam edeceği anlamına gelir. Bu durumda sistem, zamanlayıcı uygulaması çalışıyor olsun veya olmasın, uygulamayı sizin adınıza açmak için bekleyen amaçtan yararlanır.
applicationContext
,NOTIFICATION_ID
, önceki adımda oluşturduğunuzcontentIntent
vePendingIntent
işaretiyle birPendingIntent
oluşturun.PendingIntent
işareti, yeni birPendingIntent
oluşturma veya mevcut birPendingIntent
kullanma seçeneğini belirtir. Mevcut bir bildirim varsa yeni bir bildirim oluşturmak istemediğiniz içinPendingIntent.FLAG_UPDATE_CURRENT
işaretini ayarlamanız gerekir. Bu şekilde, sağladığınız amaçla ilişkili olan mevcutPendingIntent
değerini değiştirmiş olursunuz.
// NotificationUtils.kt
// TODO: Step 1.12 create PendingIntent
val contentPendingIntent = PendingIntent.getActivity(
applicationContext,
NOTIFICATION_ID,
contentIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
PendingIntent
değerini bildiriminize iletin. Bunu,NotificationBuilder
üzerindesetContentIntent()
numaralı telefonu arayarak yapabilirsiniz. Artık bildirimi tıkladığınızdaPendingIntent
tetiklenerekMainActivity
açılacak.- Ayrıca, kullanıcı bildirime dokunduğunda uygulamaya yönlendirilirken bildirimin kendiliğinden kapatılması için
setAutoCancel()
değerinitrue
olarak ayarlayın.
// NotificationUtils.kt
// TODO: Step 1.13 set content intent
.setContentIntent(contentPendingIntent)
.setAutoCancel(true)
- Uygulamayı tekrar çalıştırın.
- Zamanlayıcı ayarlayın, uygulamayı arka plana alın ve bildirimin görünmesini bekleyin.
- Bildirimi gördüğünüzde durum çubuğunu aşağı çekerek bildirimi tıklayın ve uygulamanın nasıl ön plana getirildiğini gözlemleyin.
5. adım: Bildirimi iptal edin
Bildirimleri olan işlevsel bir yumurta zamanlayıcınız var ancak küçük bir sorun var. Zamanlayıcıyı ayarlayıp bildirim aldıktan sonra zamanlayıcıyı tekrar ayarlarsanız yeni zamanlayıcı çalışırken önceki bildirim durum çubuğunda kalır. Uygulama arka planda çalışıyorsa bu durum kullanıcılarınızın kafasını karıştırabilir ve yumurtaların az pişmesine neden olabilir.
Bu sorunu düzeltmek için yeni bir zamanlayıcı başlattığınızda önceki bildirimi temizlemeniz gerekir. NotificationUtils.kt
içinde başka bir uzantı işlevi oluşturarak başlayın. NotificationManager
, cancelAll
()
adlı etkin bildirimleri iptal etmeye yarayan bir API'ye sahiptir.
NotificationsUtil.kt
adlı kişiyi aç.NotificationManager
üzerindecancelAll()
işlevini çağıran bir uzantı işlevi ekleyin.
// NotificationUtils.kt
// TODO: Step 1.14 Cancel all notifications
/**
* Cancels all notifications.
*
*/
fun NotificationManager.cancelNotifications() {
cancelAll()
}
EggTimerViewModel.kt
uygulamasını açıpstartTimer()
işlevine gidin.startTimer()
içinde, sistemdenNotificationManager
örneğini alın vecancelNotifications()
'ı çağırın.
// EggTimerViewModel.kt
//TODO Step 1.15 call cancel notification
val notificationManager =
ContextCompat.getSystemService(
app,
NotificationManager::class.java
) as NotificationManager
notificationManager.cancelNotifications()
- Uygulamayı çalıştırın ve zamanlayıcıyı başlatın.
- Bildirimi gördüğünüzde zamanlayıcıyı tekrar başlatın ve uygulamamızın önceki bildirimi durum çubuğundan otomatik olarak nasıl sildiğini gözlemleyin.
Bildirim çerçevesi, geliştiricilerin özel işlemler ayarlaması ve bildirimlerini gerektiği gibi şekillendirmesi için çeşitli özelleştirme seçenekleri sunar. Bu görev sırasında, yumurta zamanlayıcı bildirimlerinizi nasıl özelleştireceğinizi öğreneceksiniz.
1. adım: Bildiriminize stil uygulayın
Bildiriminizi ihtiyaçlarınıza ve bildirim içeriğine göre şekillendirmek, bildirimlerinizin öne çıkmasını ve uygulamanızın bir uzantısı gibi görünmesini sağlar. Bildirim çerçevesi, yardımcı olmak için çeşitli yerleşik stillerle birlikte gelir ve istediğiniz zaman kendi stilinizi oluşturabilirsiniz.
NotificationCompat
, aşağıdakiler için yerleşik stiller sunar:
BigTextStyle
. Bu öğe, genişletildiğinde e-posta içeriğini göstermek gibi büyük bir metin bloğunu görüntüleyebilir.- Büyük resim eki içeren büyük formatlı bildirimleri gösteren
BigPictureStyle
InboxStyle
, sohbet tarzı metin içeriği gösteriliyor.MediaStyle
simgesine dokunun. Bu simge, medya oynatma kontrollerini gösterir.MessagingStyle
: Herhangi bir sayıda kişi arasındaki birden fazla mesajı içeren büyük formatlı bildirimleri gösterir.
Diğer stiller hakkında daha fazla bilgiyi Genişletilebilir Bildirim Oluşturma dokümanında bulabilirsiniz. Bu adımda, genişletildiğinde büyük bir yumurta resmi gösteren genişletilebilir bir bildirim oluşturmak için NotificationCompat.BigPictureStyle
öğesini kullanacaksınız.
NotificationUtils.kt
simgesini açıpsendNotification()
işlevini bulun.resources
simgesini kullanarakBitmapFactory
bir resim yükleyerek başlayın.
// NotificationUtils.kt
// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
applicationContext.resources,
R.drawable.cooked_egg
)
- Yeni bir
BigPictureStyle
oluşturun ve resminizi ayarlayın. - Bildirim genişletildiğinde büyük simgenin kaybolması için
bigLargeIcon()
seçeneğininull
olarak ayarlayın.
// 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)
setStyle()
ile stilibigPicStyle
olarak ayarlayın.setLargeIcon()
simgesini içeren büyük simgeyieggImage
olarak ayarlayın. Böylece, bildirim daraltıldığında resim daha küçük bir simge olarak gösterilir.
// NotificationUtils.kt
// TODO: Step 2.1 add style to builder
.setStyle(bigPicStyle)
.setLargeIcon(eggImage)
- Uygulamayı çalıştırın ve zamanlayıcı ayarlayın. Bildirim ilk gösterildiğinde bildirim çekmecesinde daraltılmış durumdadır. Bildirimi genişlettiğinizde, genişletilmiş bildirim alanında büyük bir resim gösterilir.
2. adım: Bildirim işlemleri
Bildirim işlemleri, bildirimlerinize ekleyebileceğiniz başka bir özelleştirme türüdür. Bildirimleriniz şu anda kullanıcılar tarafından tıklandığında uygulamanıza yönlendiriyor. Bu varsayılan bildirim işlemine ek olarak, uygulama ile ilgili bir görevi bildirimden tamamlayan işlem düğmelerini ekleyebilirsiniz.
Bildirimler, kullanıcıların hızlı yanıt vermesini sağlayan en fazla üç işlem düğmesi sunabilir. Örneğin, hatırlatıcıyı erteleyebilir veya kısa mesajı yanıtlayabilir. Bu işlem düğmeleri, kullanıcının bildirime dokunduğunda gerçekleştirilen işlemi tekrarlamamalıdır.
İşlem düğmesi eklemek için oluşturucudaki addAction()
işlevine PendingIntent
iletin. Bu, setContentIntent()
çağırarak bildirimin varsayılan dokunma işlemini ayarlamaya benzer. Ancak bir etkinlik başlatmak yerine, çeşitli başka işlemler yapabilirsiniz. Örneğin, arka planda bir iş gerçekleştiren BroadcastReceiver
başlatabilirsiniz. Böylece işlem, zaten açık olan uygulamayı kesintiye uğratmaz.
Bu codelab'de, SnoozeReceiver
adlı bir BoadcastReceiver
zaten verilmiştir. Kullanıcının Bildirim işlemine yaptığı tıklamayı almak için SnoozeReceiver
öğesini kullanırsınız. Aşağıdaki adımlarda, kullanıcı erteleme işlemi düğmesini tıkladığında yumurta zamanlayıcı bildirimini 60 saniye erteleyecek kodu ekleyeceksiniz. Erteleme işlemi tıklandığında SnoozeReceiver
bir amaç alır ve 60 saniye sonra yeni bir bildirim göndermek için yeni bir alarm oluşturur.
SnoozeReceiver.kt
adlı kişiyi aç. Bu sınıf, daha önce kullandığınızAlarmReceiver
sınıfına benzer. Aşağıdaki adımlarda,SnoozeReceiver
öğesininonReceive()
işlevini tetikleyecek kodu ekleyeceksiniz. Kısacası,SnoozeReceiver
içindeki kod, bir dakika sonra yeni bir bildirim göndermek için yeni bir alarm oluşturur. onReceive işlevinin en altına kaydırın, sistemden notificationManager örneğini alın ve cancelAll'u çağırın.
// SnoozeReceiver.kt
val notificationManager = ContextCompat.getSystemService(
context,
NotificationManager::class.java
) as NotificationManager
notificationManager.cancelAll()
SnoozeReceiver
uygulamasını kullanmak içinNotificationUtils.kt
uygulamasını açın.-
sendNotification()
işlevindeki stilden hemen sonraSnoozeReceiver
için yeni birIntent
snoozeIntent
oluşturun. - Aşağıdaki adımlarda parametreleri bekleyen
PendingIntent
üzerindegetBroadcast()
yöntemini çağırarak bekleyen bir intent oluşturun. BuPendingIntent
, erteleme düğmesine dokunulduğunda 60 saniye sonra yeni bir bildirim yayınlamak için yeni bir alarm kurmak üzere sistem tarafından kullanılır. - İlk parametre, bu
PendingIntent
öğesinin etkinliği başlatması gereken uygulama bağlamıdır. - İkinci parametre, bu bekleyen amaç için istek kodu olan istek kodudur. Beklemedeki bu amacı güncellemeniz veya iptal etmeniz gerekirse beklemedeki amaca erişmek için bu kodu kullanmanız gerekir.
- Ardından, başlatılacak etkinliğin amacı olan
snoozeIntent
nesnesini ekleyin. - Son olarak, amaç yalnızca bir kez kullanılacağından
#FLAG_ONE_SHOT
işaret değerini ekleyin. Hızlı işlem ve bildirim, ilk dokunuştan sonra kaybolur. Bu nedenle, amaç yalnızca bir kez kullanılabilir.
// 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
)
- Ardından,
notificationBuilder
üzerindeaddAction()
işlevini çağırın. Bu işlev, kullanıcıya eyleminizi açıklayan bir simge ve metin bekler. AyrıcasnoozeIntent
eklemeniz gerekir. Bu amaç, işleminiz tıklandığında doğruboadcastReceiver
'yı tetiklemek için kullanılır.
// NotificationUtils.kt
// TODO: Step 2.3 add snooze action
.addAction(
R.drawable.egg_icon,
applicationContext.getString(R.string.snooze),
snoozePendingIntent
)
- Erteleme işlemini test etmek için yumurta zamanlayıcı uygulamasını çalıştırın.
- Zamanlayıcıyı çalıştırın ve uygulamayı arka plana alın. Zamanlayıcı sona erdiğinde bildirimi genişletin. Bildirimde artık yumurta zamanlayıcısını bir dakika daha erteleyen bir erteleme işlem düğmesi olduğunu görürsünüz.
3. adım: Bildirimlerin önemi
Önem, bildirimin kullanıcının çalışmasını görsel ve işitsel olarak ne kadar keseceğini belirler. Önem düzeyi daha yüksek olan bildirimler, kullanıcıların çalışmasını daha fazla keser.
Önem düzeyini NotificationChannel
oluşturucusunda belirtmeniz gerekir. Yumurta zamanlayıcı uygulaması için başlangıçta düşük önem düzeyi ayarladınız. IMPORTANCE_NONE(0)
ile IMPORTANCE_HIGH(4)
arasında değişen beş önem düzeyinden birini kullanabilirsiniz. Bir kanala atadığınız önem düzeyi, bu kanalda yayınladığınız tüm bildirim iletileri için geçerlidir.
Kanal Önem Düzeyleri
Kullanıcı tarafından görülebilen önem düzeyi | Önem (Android 8.0 ve sonraki sürümler) | Öncelikli (Android 7.1 ve önceki sürümler) |
Ses çıkarır ve uyarı bildirimi olarak görünür (ekranın üst kısmında açılır). | ||
Ses çıkarır | ||
Ses yok | ||
Ses çıkarmaz ve durum çubuğunda görünmez. |
Uygun bir öncelik seviyesi seçme hakkında bilgi edinmek için Bildirim tasarımı kılavuzu'ndaki "Öncelik seviyeleri" bölümüne bakın. Uygulamanızdaki bildirimler için önem düzeyi seçerken dikkatli olmalısınız. Kanalın önem düzeyi, kullanıcının zamanı ve dikkati göz önünde bulundurularak seçilmelidir. Önemsiz bir bildirimin acil olarak gösterilmesi gereksiz bir alarm oluşturabilir ve dikkat dağıtabilir. Kullanıcılar bildirimlerinin önem düzeyini tamamen kontrol edebilir. Bu nedenle, rahatsız edici bir bildirim oluşturursanız kullanıcılar bildirim kanalınızı tamamen kapatabilir.
1.6. adımda bildirimi ilk oluşturduğunuzda, kullanıcıyı bildirimlerle rahatsız etmemek için tasarlanan geri sayım sayacı, bildirimleri düşük öncelikli olarak gönderecek şekilde ayarlanmıştı. Ancak yumurta pişmeden önce kullanıcının dikkatini çekmek iyi bir fikir olabilir. Bildirimin önem düzeyini değiştirmek için kanal ayarlarından başlayın. Kanalın önem düzeyi, kanalda yayınlanan tüm bildirimlerin kesinti düzeyini etkiler ve NotificationChannel
oluşturucusunda belirtilmelidir.
- Uygulamanızın bildirim kanalının önem düzeyini değiştirmek için
EggTimerFragment.kt
uygulamasını açıpcreateChannel()
bölümüne gidin. Önem düzeyiniIMPORTANCE_LOW
olarak değiştirin.IMPORTANCE_HIGH
// EggTimerFragment.kt
val notificationChannel = NotificationChannel(
channelId,
channelName,
// TODO: Step 2.4 change importance
NotificationManager.IMPORTANCE_HIGH
)
Android 7.1 (API düzeyi 25) veya önceki sürümlerini çalıştıran cihazları desteklemek için NotificationCompat
sınıfındaki bir öncelik sabiti kullanarak her bildirim için setPriority()
işlevini de çağırmanız gerekir.
NotificationUtils.kt
dosyasını açın ve bildirim oluşturucu nesnesine aşağıdakileri ekleyin.
// 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)
- Uygulamayı çalıştırmadan önce cihazınızda veya emülatörünüzde uygulama simgesini uzun tıklayın ve önceki kanal ayarlarını temizlemek için Kaldır'ı seçin. Uygulamayı kaldırmazsanız kanal önceliği ayarları değişmez ve bu durum, bildirim yayınlandığında herhangi bir davranış değişikliğine neden olmaz.
- Şimdi uygulamayı tekrar çalıştırın ve zamanlayıcıyı başlatın. Bu kez bildirim gönderildiğinde, uygulamanızın ön planda veya arka planda çalışıp çalışmadığına bakılmaksızın ekranın üst kısmında bir pop-up görünmelidir.
4. adım: Bildirim rozetleri
Bildirim rozetleri, uygulamada etkin bir bildirim olduğunda ilişkili uygulamanın başlatıcı simgesinde görünen küçük noktalardır. Kullanıcılar, bildirimleri görmek için uygulama simgesine uzun basabilirler.
Rozet adı verilen bu noktalar varsayılan olarak görünür ve uygulamanızın herhangi bir işlem yapması gerekmez. Ancak, rozetlerin bildirimleriniz için anlamlı olmadığı durumlar olabilir. Bu nedenle, NotificationChannel
nesnenizde setShowBadge(false)
çağrısı yaparak rozetleri kanal bazında devre dışı bırakabilirsiniz. Yumurta zamanlayıcısında belirli bir anda yalnızca bir etkin bildirim olduğundan, uygulama simgenizdeki rozet kullanıcılarınıza pek bir fayda sağlamaz. Aşağıdaki adımlarda rozeti devre dışı bırakacak ve yalnızca yumurta zamanlayıcı için bildirim göstereceksiniz.
- Rozetleri devre dışı bırakmak için yumurta zamanlayıcının kanal oluşturma koduna
setShowBadge(false)
ekleyin.
// EggTimerFragment.kt
).apply {
// TODO: Step 2.6 disable badges for this channel
setShowBadge(false)
}
- Uygulamayı tekrar çalıştırın, zamanlayıcıyı başlatın ve uygulama simgesini izleyin. Uygulama simgesinde herhangi bir rozet görmemeniz gerekir.
Çözüm kodu, indirdiğiniz kodun ana dalındadır.
- NotificationManager sınıfını kullanarak bildirim oluşturma, gönderme, güncelleme ve iptal etme.
- Bildirim için kanal ayarlamak üzere createNotificationChannel yöntemiyle NotificationChannel nesnesini kullanın.
- Bildirime hızlı işlemler eklemek için addAction() işlevini kullanın.
- Rozetleri etkinleştirmek veya devre dışı bırakmak için setShowBadge() yöntemini kullanın.
- Notification.Style'dan türetilen stilleri kullanarak bildirimlerinizi şekillendirin.
- Önem düzeyini NotificationChannel.setImportance() ile ayarlayın.
Udacity kursu:
Android geliştirici belgeleri:
Bu kurstaki diğer codelab'lerin bağlantıları için Advanced Android in Kotlin codelab'lerinin açılış sayfasına bakın.