Bu codelab, Kotlin'deki Gelişmiş Android kursuna dahildir. Codelab'ler sırasında sırayla çalıştığınızda bu kurstan en yüksek değeri elde edersiniz ancak zorunlu değildir. Tüm kurs codelab'leri Kotlin Codelab'de Gelişmiş Android açılış sayfasında listelenmiştir.
Giriş
Bildirimler, kullanıcıya uygulamanızın kullanıcı arayüzünün dışında gösterilen mesajlardır. Bildirimler, cihaz kilitli değilken ekranın üst kısmında veya güvenlik ayarlarına bağlı olarak cihaz kilitliyken kilit ekranında gösterilir.
Tipik bir bildirim, başlık, açıklama ve simgeden oluşur. Bildirimde tıklanabilir işlemler, hızlı yanıt, uzatılabilir içerik ve resimler de bulunabilir.
Bildirimler zamanında içerik sunabilir ve kullanıcının yanıt gönderme veya alarmı erteleme gibi hızlı işlemler gerçekleştirmesine olanak tanıyan düğmeler içerebilir. Bir bildirim tıklandığında kullanıcı, uygulamanızda bildirim içeriğiyle ilgili bir görünüme yönlendirilir.
Bildirimler, kullanıcılara önemli bir görevi hatırlatmak, onlara bir şey olduğunu bildirmek veya uygulamanız arka plandayken ihtiyaç duydukları önemli bilgileri anında iletmek için yararlı bir yoldur. Bildirimleri dikkatli bir şekilde kullanın. Bu, kullanıcılara saygı duymakla kalmaz, uygulamanızın bildiriminin hak ettiği ilgiyi çekme olasılığını da artırır.
Bu codelab'de, Android uygulamalarında bildirim oluşturmayı ve kullanmayı öğreneceksiniz.
Bilmeniz gerekenler
Aşağıdaki konular hakkında bilgi sahibi olmalısınız:
- Kotlin'de Android uygulamaları nasıl oluşturulur? Özellikle Android SDK ile çalışın.
- Mimari Bileşenler ve veri bağlamayı kullanarak uygulama tasarlama.
- BroadcastReceivers'la ilgili temel bilgiler
- AlarmManager'la ilgili temel bir anlayış
Neler öğreneceksiniz?
- Bildirim oluşturma, biçimlendirme ve gönderme.
- Bildirimleri iptal etme.
- Bildirim kanalları nasıl oluşturulur?
- Bildirimlere hızlı işlemler ekleme.
- Uygulama simgesinde bildirim rozetleri nasıl görüntülenir?
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.
- Bildiriminizi etkileşimli hale getirmek için Hızlı İşlemler'i ekleyin.
- Bildirim rozetlerini devre dışı bırakın.
Yumurta pişirmek basittir ancak zamanı takip edemezseniz zor bir iştir. Bu codelab'de, gelecekte kullanacağınız yumurtalarınız gibi bir yumurta zamanlayıcı üzerinde çalışacak ve mükemmel bir uygulama yapacaksınız. Kullanıcının farklı yumurta tarzları için farklı pişirme süresi ayarlarını yapabilmesini sağlayan çalışan bir yumurta zamanlayıcı uygulamasıyla başlarsınız. Zamanlayıcı, seçilen zaman aralığından geri sayım yapar ve yumurta hazır olduğunda kısa mesaj gösterir.
Bu işlev bir işe yarasa da mükemmel değildir ve gerçekten kullanıcı dostu değildir. Kısa mesaj, kısa bir süre için gösterileceğinden kısa sürede kolayca kaybolabilir. Ayrıca, uygulama ön planda değilse veya cihaz kilitliyse kadeh kaybolduktan sonra zamanlayıcının durumuyla ilgili görsel bir gösterge yoktur.
İdeal olarak, yumurta zamanlayıcının kullanıcılara süre dolduğunda bildirim göndermek için bildirimleri kullanması gerekir. Kullanıcının yumurtanın hemen hazır olduğunu bilmesi gerekir. Aksi halde yumurta çok pişirilir. Bildirimler görseldir, sesler içerebilir ve cihazın titreşmesini sağlayabilir. Kullanıcının dikkatini çekmenin tüm yolları Bu sayede, kusursuz yumurtalara ve mutlu, iyi beslenen kullanıcılara ulaşabilirsiniz.
Örnek uygulamayı edinmek için aşağıdakilerden birini yapabilirsiniz:
Depoyu GitHub'dan klonlayın ve starter dalına geçin.
$ git clone https://github.com/googlecodelabs/android-kotlin-notifications
Alternatif olarak, veri havuzunu Zip dosyası olarak indirip sıkıştırılmış dosyayı Android Studio'da açabilirsiniz.
- Android Studio'da uygulamayı açıp çalıştırın.
Bir yumurta resmi ve yumurta pişirmek için önceden tanımlanmış zaman aralıkları listesini içeren bir açılır menü görürsünüz. Düşük Kaynatılmış açılır menüsü için üçgeni tıklayın. Listedeki ilk seçenek test amaçlıdır ve alarmı yalnızca 10 saniyeye ayarlar. Listenin yanında, yumurta zamanlayıcıyı başlatan bir anahtar bulunur. Yumurta zamanlayıcısını istediğiniz zaman başlatmak ve durdurmak için bu anahtarı kullanabilirsiniz. Başlangıç kodu tamamen işlevseldir. Yani yumurta zamanlayıcıyı ayarlayıp 0'a kadar sayabilirsiniz. Zamanlayıcının süresi dolduğunda, aşağıda gösterildiği gibi bir kısa mesaj gösterilir.
- Kaynak kodunu 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çerir. Kullanıcı tarafından tanımlanan zamanlayıcı dolduğundaAlarmReceiver
, bildirimi göndermek içinAlarmManager
tarafından tetiklenir.SnoozeReceiver
, bildirimi ertelemek için kullanıcı 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. Zamanlayıcının başlatılması ve iptal edilmesinden ve yaşam döngüsüyle ilgili diğer uygulama görevlerindenEggTimerViewModel
sorumludur. - /util: Bu pakette iki dosya bulunur.
BindingUtils.kt
, uygulama kullanıcı arayüzü ileViewModel
arasında veri bağlamayı etkinleştirmek için bağlayıcı adaptörlerine sahiptir.NotificationUtils.kt
,NotificationManager
üzerinde uzantı yöntemlerine sahiptir.
Bildirimleri kullanmak, kullanıcıların dikkatini uygulamanıza çekmenin harika bir yoludur. Uygulamanız ön planda çalışmıyor veya ön planda çalışıyor olsa bile bir bildirim, ekranın üst kısmında bir pop-up pencere gösterir ve ses ya da titreşim içerebilir. Bildirim oluşturmak için bir bildirim oluşturucu kullanmanız ve başlık metni, içerik metni ve simge sağlamanız gerekir. Geliştirici gerekli tüm alanlara ulaştığında, sistem hizmeti olan NotificationManager
bu içeriği bildirim olarak görüntülemenize yardımcı olur. NotificationManager
, bildirim göndermekten, içeriğini güncellemekten ve bildirimi iptal etmekten sorumludur. Aşağıdaki adımlarda NotificationManager
ürününe uzantı yöntemleri ekleyeceksiniz. Bu sayede, NotificationManager
ürününü her kullanmanız gerektiğinde, ihtiyacınız olan işlevi elde etmek için bu uzantı işlevlerinden yararlanabilirsiniz.
1. Adım: Temel Bildirim oluşturun
Bu görevde yeni bir bildirim oluşturmak, kullanıcınız için bir mesaj ayarlamak ve bildirim göndermek.
NotificationUtils.kt
sınıfını açın veTODO: Step 1.1
ifadesini bulun. Eşleşen yapılacaklar listesini bu codelab'de ve uygulama kodunda bulabilirsiniz.- Belirtilen
sendNotification()
işlevini inceleyin. Bu uzantı işleviniNotificationManager
gönderilecek şekilde genişleteceksiniz.
//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 bir 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 bir arada gruplandırarak kanaldaki tüm bildirimleri kontrol edebilirler. Kanallar, oluşturulduktan sonra istedikleri 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ı tanıtmak için, kullanıcıya vermek istediğiniz mesajın başlığını ve içerik metnini temsil edecek şekilde ayarlayın. Codelab'de bildiriminizi daha da özelleştirmek için daha fazla seçenek göreceksiniz. Ancak bu, bildirim göndermek için ayarlamanız gereken minimum veri miktarıdır.
//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)
- Daha sonra, bildiriminiz için benzersiz bir kimlik ve oluşturucunuzdaki
Notification
nesnesiyle birliktenotify()
çağırmanız gerekir.
Bu kimlik, geçerli bildirim örneğini temsil eder ve bu bildirimin güncellenmesi veya iptal edilmesi için gereklidir. Uygulamanız her defasında yalnızca bir etkin bildirim alacağından tüm bildirimleriniz için aynı kimliği kullanabilirsiniz. Bu amaç için size NotificationUtils.kt
'da NOTIFICATION_ID
adlı bir sabit değer zaten verilmiştir. Aynı sınıftaki bir uzantı işlevinden çağrı gerçekleştirdiğiniz için notify()
öğesini doğrudan arayabileceğ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
işlevini açın vestartTimer()
işlevini bulun. Bu işlev, kullanıcı yumurta zamanlayıcıyı etkinleştirdiğinde seçili zaman aralığına sahip 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ğini kullanmanız gerekir.NotificationManager
, eklediğiniz uzantı işlevi de dahil olmak üzere, bildirimler API'sinin açığa çıktığı tüm işlevleri sağlayan bir sistem hizmetidir. Bildirim göndermek, iptal etmek veya güncellemek istediğinizde, sistemdenNotificationManager
ürününün bir örneğini istemeniz gerekir. Bildirim mesajı ve bağlamla birliktesendNotification()|
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 bitti. 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"
araması yapın.egg_channel
öğesinin var olmadığını belirten bir hata mesajı görürsünüz. Aşağıdaki adımlarda, Bildirim Kanalları hakkında daha fazla bilgi edinecek ve bu durumu düzelteceksiniz.
2. Adım: Bildirim Kanalları
API düzeyi 26'dan itibaren tüm bildirimler bir kanala atanmalıdır. Uygulama başlatıcı simgesine dokunup basılı tutar, uygulama bilgilerini ve bildirimlere dokunursanız uygulamayla ilişkili bildirim kanallarının listesini görürsünüz. Uygulamanız şu anda kanal oluşturmadığı için liste boş.
Kanallar, bir bildirim türünü temsil eder. Örneğin, yumurtanız pişirildiğinde yumurta zamanlayıcınız bildirim gönderebilir ve siz de kahvaltıda yumurtanızın olduğunu hatırlatmak için günlük bildirimler göndermek amacıyla başka bir kanal kullanabilir. Bir kanaldaki tüm bildirimler birlikte gruplandırılır ve kullanıcılar kanalın tamamı için bildirim ayarlarını yapılandırabilir. Bu sayede kullanıcılar bildirim ayarlarını, ilgilendikleri bildirim türüne göre kişiselleştirebilir. Örneğin, kullanıcılar kahvaltı bildirimlerini devre dışı bırakabilir, ancak zamanlayıcıdaki bildirimleri görmeyi tercih edebilir.
Geliştiriciler bir kanaldaki tüm bildirimlere uygulanacak ilk ayarları, önem ve davranışı belirler. İlk ayarları yapmanızın ardından kullanıcılar bu ayarları geçersiz kılabilir.
1.1. Adımda bildirim kanalınız olarak egg_notification_channel_id
adresini kullandınız. Şimdi, bu kanalın bildirim ayarlarını ve davranışını gerçekten oluşturup özelleştirmeniz gerekiyor.
EggTimerFragment.kt
işlevini açın vecreateChannel()
işlevini bulun.- Benzersiz kanal kimliğini
NotificationChannel
sitesinin oluşturucusuna iletin. - Kullanıcıların, Ayarlar ekranında da görecekleri bildirim kanalı adını iletin.
- Son parametre olarak bildirim kanalının önem seviyesini iletin. Önem düzeyleri bu codelab'in ilerleyen bölümlerinde ele alınacaktır. Bu nedenle, şimdilik
NotificationManag
er.IMPORTANCE_LOW
ürününü kullanabilirsiniz. notificationChannel
nesnesindeenableLights
değerini true olarak ayarlayın. Bu ayar, bir bildirim gösterildiğinde ışıkları etkinleştirir.- Bildirim gösterildiğinde kırmızı ışık göstermek için
notificationChannel
nesnesindelightColor
öğesini 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()
çağırarakNotificationManager
örneğini alın.-
NotificationManager
öğesindecreateNotificationChannel()
öğesini ç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
}
- Daha sonra, 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. Kanalınızın kimliğini ve kanal adını, projenizde verilen dize kaynaklarından 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. Bunu zaten 1.2. adımda yaptınız. Kanal kimliği yanlış bir değere ayarlanırsa bildirim başarısız olur. Daha önce ayarladığınız kanal kimliğinin doğru olduğunu onaylamak için
NotificationUtils.kt
uygulamasını 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ırdığınızda, 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ığı, içerik ve simgenin önceki adımlarda ayarladığınız şekilde olduğunu göz önünde bulundurun.
- Yeni oluşturulan kanalı doğrulamak için uygulamayı kapatıp uygulama simgesini bulun. Uygulama simgesine uzun dokunduktan sonra Uygulama bilgileri'ni seçin.
- Ayarlar listesinden Bildirimler'i seçin. Bildirimleri göster ayarının hemen altındaki Yumuşak adlı yeni bir kanal görürsünüz.
Uygulamayı çalıştırdığınızda bildirim gösterilir. Hem uygulama geliştiricisi olarak hem de kullanıcılarınız, bu kanalda gönderilen tüm bildirimlerin ayarlarını ve davranışını özelleştirebilirsiniz. Tebrikler, bir bildirim oluşturdunuz.
3. Adım: Uygulamanıza bildirimler ekleyin
Şu ana kadar bildirimler API'sinin temel kullanımı gösteriliyor ancak zamanlayıcının başlamasından hemen sonra bildirim göndermek pek mantıklı değil. Kullanıcılar büyük olasılıkla yumurta hazır olduğunda bilgilendirilmeyi tercih eder. Codelab'in aşağıdaki bölümünde, bu durumu düzeltecek ve kısa mesajı bildirim olarak değiştireceksiniz.
Bu bildirimi zaten göndermiştiniz ve kullanıcılara nasıl gösterildiğini fark ettiniz ancak bu mükemmel bildirimler oluşturmanın 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
özelliğini kullanıyor. AlarmManager
ile ilgili kod, başlangıç kodunda zaten verilmiştir ve kısa mesajı göstermek için kullanılır. AlarmManager
, istenen zaman seçimini izler ve süre dolduğunda AlarmReceiver.kt
öğesinin onReceive()
işlevini tetikler. AlarmReceiver.kt
uygulamasını açıp onReceive()
uygulamasına giderseniz bir yumurta zamanlayıcısı her ayarladığınızda gösterilen kısa mesaj mesajını görürsünüz.
NotificationManager
öğesinin bir örneği olanAlarmReceiver.kt
öğesini açın ve mesaj metni ve bağlam parametreleriylesendNotification()
işlevini ç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ı kapatıldığında uygulamanız bildirim göndereceğinden kısa mesajı 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ı her kapatıldığında bir bildirim görürsünüz.
Bu ideal bir şey değil. Kullanıcılarınıza çok fazla bildirim göndermek istemiyorsunuz. Kullanıcı zamanlayıcıyı başlattığında gönderilen ilk bildirimi kaldırabilirsiniz.
EggTimerFragment.kt
uygulamasını açın ve 1.5. adım için 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ı ayarlayın, arka plana koyun ve zamanın bitmesini bekleyin. Bir bildirim görürsünüz. Bu çok daha faydalı bir bildirimdir.
4. Adım: İçerik amacı ekleyin
- Çalışmıyorsa uygulamayı tekrar çalıştırın.
- Bildirimi tıklayın. Hiçbir şey olmaz.
Bildirimin gösterilmesi ve kullanıcıya bilgi sağlanması harikadır, ancak kullanıcı bir bildirimi tıkladığında ilgili uygulamaya dönmeyi bekler. Codelab'in bu bölümünde, kullanıcıyı zamanlayıcı ekranına geri getirmek için amaç eklersiniz.
Intent
, başka bir uygulama bileşeninden işlem isteğinde bulunmak için kullanabileceğiniz bir mesajlaşma nesnesidir. Intent'ler bir etkinlik veya hizmet başlatmak ya da bir yayını yayınlamak için kullanılabilir. Bu durumda, kullanıcı bildirime dokunduğunda sisteme MainActivity
işlevini açmasını sağlamak için bu amacı kullanırsınız. Uygulamanız yalnızca tek bir görüntülemeden oluştuğu için burada pek fazla seçeneğiniz yok. Ancak bildirimin daha büyük bir uygulamada olması, kullanıcıyı bildirimle etkileşimde bulunduğunda mantıklı olan bir ekrana getirerek sorunsuz bir deneyim oluşturmalıdır.
NotificationUtils.kt
öğesini açıpsendNotification()
uzantı işlevini bulun.applicationContext
ve başlatılacak etkinliğiniz olanMainActivity::class.java
ile 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)
Niyeti siz oluşturdunuz ancak bildirim, uygulamanızın dışında görüntülenir. Bir niyetin uygulamanız dışında çalışması için yeni bir PendingIntent
oluşturmanız gerekir.
PendingIntent
, uygulamanız adına başka bir uygulamaya veya sisteme işlem gerçekleştirme hakkı verir. PendingIntent
, sistemin almak için kullandığı orijinal verileri açıklayan jetona verilen bir referanstır. Yani, kendi başvuru süreci sona ermiş olsa bile PendingIntent
uygulaması, kendisi için sağlanan diğer işlemlerde kullanılabilir olarak kalacaktır. Bu durumda sistem, zamanlayıcı uygulamasının çalışıp çalışmadığından bağımsız olarak uygulamayı sizin adınıza açmak için beklemedeki amacı kullanı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 bir etiketi kullanma seçeneğini belirtir. Mevcut bir bildirim varsa yeni bir bildirim oluşturmak istemediğiniz için bunuPendingIntent.FLAG_UPDATE_CURRENT
işareti olarak ayarlamanız gerekir. Bu şekilde, belirttiğiniz niyetle ilişkili olan mevcutPendingIntent
üzerinde değişiklik yaparsınız.
// NotificationUtils.kt
// TODO: Step 1.12 create PendingIntent
val contentPendingIntent = PendingIntent.getActivity(
applicationContext,
NOTIFICATION_ID,
contentIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
PendingIntent
bildirimini bildiriminize iletin. Bunu,NotificationBuilder
üzerindesetContentIntent()
numaralı telefonu arayarak yapabilirsiniz. Artık bildirimi tıkladığınızdaPendingIntent
tetiklenecek veMainActivity
cihazınız açılacak.- Ayrıca,
setAutoCancel()
'yitrue
olarak ayarlayın. Böylece, kullanıcı bildirime dokunduğunda bildirim kendisini bildirime yönlendirerek kendisini uygulamaya kaldırır.
// 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 koyun 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ı ayarlarsanız, bildirim alır ve zamanlayıcıyı tekrar ayarlarsanız yeni zamanlayıcı çalışırken önceki bildirim durum çubuğunda kalır. Uygulama arka plandaysa bu durum kullanıcınızın aklını karıştırabilir ve yumurtanın az pişmesine neden olabilir.
Bunu 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ı tüm etkin bildirimleri iptal etmek için bir API'ye sahip.
NotificationsUtil.kt
'yi açın.NotificationManager
öğesinecancelAll()
çağrısı yapan bir uzantı işlevi ekleyin.
// NotificationUtils.kt
// TODO: Step 1.14 Cancel all notifications
/**
* Cancels all notifications.
*
*/
fun NotificationManager.cancelNotifications() {
cancelAll()
}
EggTimerViewModel.kt
işlevini açın vestartTimer()
işlevine gidin.startTimer()
içinde, sistemdenNotificationManager
örneğini alın vecancelNotifications()
çağrısı yapı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ıp zamanlayıcıyı başlatın.
- Bildirimi gördükten sonra, 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 belirlemesine ve bildirimlerini gerektiği şekilde biçimlendirmesine olanak tanıyan ç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: Bildiriminizin stilini belirleyin
Bildirimlerinizi ihtiyaçlarınıza göre biçimlendirdiğinizde bildirim içerikleri öne çıkar ve uygulamanızın bir uzantısı gibi görünür. Bildirim çerçevesinin size yardımcı olacak çeşitli yerleşik stilleri vardır. Dilediğiniz zaman kendi tarzınızı oluşturabilirsiniz.
NotificationCompat
aşağıdakiler için yerleşik stiller sunar:
BigTextStyle
: Büyük bir metin bloğunu görüntüleyebilir. Örneğin, bir e-postanın içeriği genişletildiğinde bunu gösterebilir.- Büyük boyutlu resim eki içeren büyük biçimli bildirimleri gösteren
BigPictureStyle
. - İleti dizisi stilindeki metin içeriğini gösteren
InboxStyle
. - Medya oynatma kontrollerini gösteren
MediaStyle
. MessagingStyle
, istediğiniz sayıda kullanıcı arasında birden fazla mesaj içeren büyük biçimli bildirimleri gösterir.
Genişletilebilir Bildirim Oluşturma belgesinde diğer stillerle ilgili daha fazla bilgi 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
özelliğini kullanacaksınız.
NotificationUtils.kt
işlevini açın vesendNotification()
işlevini bulun.BitmapFactory
yardımıylaresources
kaynağından 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()
değerininull
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)
- Stili
setStyle()
ilebigPicStyle
olarak ayarlayın. setLargeIcon()
içeren büyük simgeyieggImage
olarak ayarlayın. Böylece, bildirim daraltıldığında resim daha küçük bir simge olarak görüntülenir.
// NotificationUtils.kt
// TODO: Step 2.1 add style to builder
.setStyle(bigPicStyle)
.setLargeIcon(eggImage)
- Uygulamayı çalıştırın ve bir zamanlayıcı ayarlayın. Bildirim ilk kez gösterildiğinde, bildirim çekmecesinde daraltılmış durumda olur. 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ştirmedir. Bildirimleriniz şu anda, kullanıcılar uygulamanıza tıkladığında yönlendirme yapmaktadır. Bu varsayılan bildirim işlemine ek olarak, bildirimden uygulamayla ilgili bir görevi tamamlayan işlem düğmeleri ekleyebilirsiniz.
Bildirim, kullanıcının hızlıca yanıt vermesine olanak tanıyan en fazla üç işlem düğmesi (ör. bir hatırlatıcıyı erteleme veya bir kısa mesajı yanıtlama) sunabilir. Bu işlem düğmeleri, kullanıcı bildirime dokunduğunda yapılan işlemi çoğaltmamalıdır.
İşlem düğmesi eklemek için oluşturucuda addAction()
işlevine bir PendingIntent
iletin. Bu, bildirimin varsayılan olarak dokunulması işlemini setContentIntent()
çağrısına benzer şekilde ayarlar. Ancak bir etkinlik başlatmak yerine başka bir çok şey yapabilirsiniz. Örneğin, arka planda iş yapan bir BroadcastReceiver
işlemi başlatabilirsiniz. Böylece işlem, açık olan uygulamayı kesintiye uğratmaz.
Bu codelab'de size SnoozeReceiver
adlı bir BoadcastReceiver
politikası verilmiştir. Bildirim işleminin kullanıcı tarafından tıklanmasını almak için SnoozeReceiver
adresini kullanırsınız. Aşağıdaki adımlarda, kullanıcı işlemi ertele düğmesini tıkladığında yumurta zamanlayıcı bildirimini 60 saniye erteleyecek bir kod 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
'yi açın. Bu ders, daha önce kullandığınızAlarmReceiver
ile benzer. Aşağıdaki adımlarda,SnoozeReceiver
öğesininonReceive()
işlevini tetikleyecek bir kod eklersiniz. Özetle,SnoozeReceiver
içindeki kod yeni bir bildirim göndermek için bir dakika sonra yeni bir alarm oluşturur. OnReceive işlevinin alt kısmına ilerleyin, sistemden reportManager örneği alın ve iptalAll işlevini ç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. PendingIntent
adımındagetBroadcast()
yöntemini çağırarak beklemedeki bir niyet oluşturun. Bunu yapmak için aşağıdaki adımlarda parametreleri bekleyin. BuPendingIntent
, sistem tarafından, ertele düğmesine dokunulduğunda 60 saniye sonra yeni bir bildirim yayınlamak üzere yeni bir alarm ayarlamak için kullanılır.- İlk parametre, bu
PendingIntent
öğesinin başlaması gereken uygulama bağlamıdır. - İkinci parametre, bu bekleyen niyet için istek kodu olan istek kodudur. Beklemedeki bu amacı güncellemeniz veya iptal etmeniz gerekiyorsa beklemedeki amaca erişmek için bu kodu kullanmanız gerekir.
- Sonra, başlatılacak etkinliğin amacı olan
snoozeIntent
nesnesini ekleyin. - Son olarak, amaç yalnızca bir kez kullanıldığından
#FLAG_ONE_SHOT
flag 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
içindeaddAction()
işlevini çağırın. Bu işlevde, kullanıcıya işleminizi açıklayan bir simge ve metin beklenir. AyrıcasnoozeIntent
eklemeniz gerekir. Bu amaç, işleminiz tıklandığında doğruboadcastReceiver
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 yerleştirin. Zamanlayıcının süresi dolduğunda bildirimi genişlettiğinizde bildirimin artık yumurta zamanlayıcısını bir dakika daha erteleyen bir erteleme işlemi düğmesi olduğunu görürsünüz.
3. Adım: Bildirimin önemi
Önem, bildirimin görsel ve işitsel olarak ne kadar kesintiye uğraması gerektiğini belirler. Önem düzeyi daha yüksek olan bildirimler kullanıcılar için daha rahatsız edici olacaktır.
Önem düzeyini NotificationChannel
oluşturucuda belirtmelisiniz. Yumurta zamanlayıcı uygulaması için başlangıçta düşük önem 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 seviyesi, ilgili kanalda yayınladığınız tüm bildirim mesajları için geçerlidir.
Kanal Önem Düzeyleri
Kullanıcıların görebileceği önem düzeyi | Önem (Android 8.0 ve sonraki sürümler) | Öncelik (Android 7.1 ve daha eski sürümler) |
Ses çıkar ve uyarı bildirimi olarak görünür (ekranın üst kısmında görünür) | ||
Ses çıkarıyor | ||
Sessiz | ||
Ses yok ve durum çubuğunda görünmüyor |
Uygun bir öncelik seviyesi seçmeyle ilgili bilgi için Bildirim tasarım kılavuzundaki "Öncelik düzeyleri"ne bakın. Uygulamanızdaki bildirimler için bir önem düzeyi seçerken dikkatli olmalısınız. Kanalın önemi ve kullanıcının zamanı ile birlikte dikkat edilmesi gerekir. Önemsiz bir bildirimin acil olarak gizlenmiş olması, gereksiz alarmlara yol açabilir ve dikkat dağıtıcı olabilir. Kullanıcılar, bildirimlerinin önem seviyesini tamamen kontrol edebilir. Bu nedenle, rahatsız edici bir bildirim oluşturursanız bildirim kanalınızı tamamen kapatabilir.
Bildirimi 1.6. adımda ilk oluşturduğunuzda, yumurta zamanlayıcısı kullanıcının bildirimleri rahatsız etmemesi için tasarlandığından düşük öncelikli bildirimler gönderecek şekilde ayarlanmış. Ancak, yumurta pişirilmeden önce kullanıcının dikkatini çekmek iyi bir fikir olabilir. Bildirimin önem düzeyini değiştirmek için kanal ayarlarıyla başlayın. Kanalın önem derecesi, kanalda yayınlanan tüm bildirimlerin kesinti seviyesini etkiler ve NotificationChannel
oluşturucuda belirtilmelidir.
- Uygulamanızın bildirim kanalının önem düzeyini değiştirmek için
EggTimerFragment.kt
uygulamasını açın vecreateChannel()
sayfasına gidin. Önem düzeyiniIMPORTANCE_LOW
yerineIMPORTANCE_HIGH
olarak değiştirin.
// 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ümleri çalıştıran cihazları desteklemek için her bir bildirimde setPriority()
sınıfını ve NotificationCompat
sınıfındaki bir öncelik sabitini kullanarak çağırmanız gerekir.
NotificationUtils.kt
uygulamasını açın ve aşağıdakileri bildirim oluşturucu nesnesine 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ızdaki veya emülatördeki uygulama simgesini uzun tıklayın ve önceki kanal ayarlarını temizlemek için yüklemeyi kaldır'ı seçin. Uygulamayı kaldıramazsanız kanal önceliği ayarları değişmez ve bildirim yayınlandığında davranışta herhangi bir değişiklik olmaz.
- Şimdi uygulamayı tekrar çalıştırın ve zamanlayıcıyı başlatın. Bu kez, bildirim yayınlandığında, uygulamanızın ön planda mı yoksa arka planda mı çalıştığına bakılmaksızın ekranın üst kısmında bir pop-up göreceksiniz.
4. Adım: Bildirim rozetleri
Bildirim rozetleri, etkin bir bildirim olduğunda söz konusu uygulamanın başlatıcı simgesinde görünen küçük noktalardır. Kullanıcılar, bildirimleri görmek için uygulama simgesine uzun basabilir.
Rozet adı verilen bu noktalar varsayılan olarak görünür ve uygulamanızın yapması gereken bir şey yoktur. Bununla birlikte, rozetlerin bildirimleriniz açısından anlamsız olabileceği durumlar olabilir. Bu nedenle, NotificationChannel
nesnenizde setShowBadge(false)
çağırarak bunları kanal bazında devre dışı bırakabilirsiniz. Yumurta zamanlayıcısının belirli bir anda yalnızca bir tane etkin bildirimi olabileceğinden, uygulama simgenizdeki rozet kullanıcılarınıza pek fayda sağlamaz. Aşağıdaki adımlarda rozeti devre dışı bırakır ve yalnızca yumurta zamanlayıcı için bir bildirim görürsünüz.
- Rozetleri devre dışı bırakmak için yumurta zamanlayıcısının kanal oluşturma koduna
setShowBadge(false)
kodunu 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örünmez.
Çözüm kodu indirilmiş kodunuzun ana dalında bulunur.
- Bildirim oluşturmak, göndermek, güncellemek ve iptal etmek için NotificationManager sınıfını kullanın.
- Bildirim için bir kanal ayarlamak üzere createNotificationChannel yöntemiyle bir NotificationChannel nesnesi kullanın.
- Bir bildirime hızlı işlemler eklemek için addAction() işlevini kullanın.
- Rozetleri etkinleştirmek veya devre dışı bırakmak için setShowBadge() işlevini kullanın.
- Notification.Style uzantısındaki stilleri kullanarak bildirimlerinizin stilini belirleyin
- Önem düzeyini NotificationChannel.setImportance() ile ayarlayın
Udacity kursu:
Android geliştirici dokümanları:
Bu kurstaki diğer codelab'lerin bağlantıları için Kotlin codelab'lerdeki Gelişmiş Android açılış sayfasına bakın.