Android Bildirimlerini Kullanma

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.

Zip dosyasını indir

  1. 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.

  1. Kaynak kodu inceleyin. Başlangıç uygulaması, MainActivity adlı tek bir etkinlikten oluşur. receiver, ui ve util adlı üç alt paket vardır.

  • /receiver: receiver paketi, AlarmReceiver ve SnoozeReceiver adlı iki yayın alıcısı içeriyor. AlarmReceiver, kullanıcı tanımlı zamanlayıcı sona erdiğinde bildirimi göndermek için AlarmManager 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ü ile ViewModel 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.

  1. NotificationUtils.kt sınıfını açıp TODO: Step 1.1 simgesini bulun. Bu codelab'de ve uygulama kodunda eşleşen yapılacaklar listeleri bulacaksınız.
  2. Belirtilen sendNotification() işlevini inceleyin. Bildirim göndermek için bu uzantı işlevini NotificationManager'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) {
  1. 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)
)
  1. 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)
  1. Ardından, bildiriminize ait benzersiz bir kimlikle ve oluşturucunuzdaki Notification nesnesiyle notify() 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())
  1. ui/EggTimerViewModel.kt simgesini açıp startTimer() işlevini bulun. Bu işlev, kullanıcı zamanlayıcıyı etkinleştirdiğinde seçilen zaman aralığıyla bir alarm oluşturur.
  2. 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çin NotificationManager ö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 sistemden NotificationManager örneği istemeniz gerekir. Bildirim mesajı ve bağlam ile sendNotification()| 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.

  1. 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.

  1. EggTimerFragment.kt simgesini açıp createChannel() işlevini bulun.
  2. Benzersiz kanal kimliğini NotificationChannel oluşturucusuna iletin.
  3. Kullanıcıların Ayarlar ekranında da göreceği bildirim kanalı adını iletin.
  4. 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 NotificationManager.IMPORTANCE_LOW kullanabilirsiniz.
  5. notificationChannel nesnesinde enableLights özelliğini doğru olarak ayarlayın. Bu ayar, bildirim gösterildiğinde ışıkların yanmasını sağlar.
  6. Bildirim gösterildiğinde kırmızı ışık görüntülemek için notificationChannel nesnesinde lightColor değerini kırmızı olarak ayarlayın.
  7. Titreşimi etkinleştirmek için notificationChannel nesnesinde enableVibration değerini true olarak ayarlayın.
  8. notificationChannel nesnesinde kanal açıklamasını ‘Time for breakfast' olarak ayarlayın.
  9. getSystemService() numaralı telefonu arayarak NotificationManager örneği edinin.
  10. createNotificationChannel() işlevini NotificationManager üzerinde çağırın ve önceki adımda oluşturduğunuz notificationChannel 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
}
  1. 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)
    )
  1. 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)
)
  1. Uygulamayı çalıştırın. Zamanlayıcıyı her başlattığınızda uygulamanın bildirim gönderdiğini görürsünüz.
  2. 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.
  3. 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.

  1. 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.

  1. AlarmReceiver.kt, NotificationManager örneğini açın ve sendNotification() 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
   )
  1. İ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()
  1. 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.

  1. 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)
  1. Uygulamanızı tekrar çalıştırın.
  2. 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

  1. Henüz çalışmıyorsa uygulamayı tekrar çalıştırın.
  2. 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.

  1. NotificationUtils.kt dosyasını açın ve sendNotification() uzantı işlevini bulun.
  2. Intent ile applicationContext ve başlatılacak etkinlik MainActivity::class.java ile ilgili bir Intent 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.

  1. applicationContext, NOTIFICATION_ID, önceki adımda oluşturduğunuz contentIntent ve PendingIntent işaretiyle bir PendingIntent oluşturun. PendingIntent işareti, yeni bir PendingIntent oluşturma veya mevcut bir PendingIntent kullanma seçeneğini belirtir. Mevcut bir bildirim varsa yeni bir bildirim oluşturmak istemediğiniz için PendingIntent.FLAG_UPDATE_CURRENT işaretini ayarlamanız gerekir. Bu şekilde, sağladığınız amaçla ilişkili olan mevcut PendingIntent 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
    )
  1. PendingIntent değerini bildiriminize iletin. Bunu, NotificationBuilder üzerinde setContentIntent() numaralı telefonu arayarak yapabilirsiniz. Artık bildirimi tıkladığınızda PendingIntent tetiklenerek MainActivity açılacak.
  2. Ayrıca, kullanıcı bildirime dokunduğunda uygulamaya yönlendirilirken bildirimin kendiliğinden kapatılması için setAutoCancel() değerini true olarak ayarlayın.
// NotificationUtils.kt
    // TODO: Step 1.13 set content intent
    .setContentIntent(contentPendingIntent)
    .setAutoCancel(true)
  1. Uygulamayı tekrar çalıştırın.
  2. Zamanlayıcı ayarlayın, uygulamayı arka plana alın ve bildirimin görünmesini bekleyin.
  3. 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.

  1. NotificationsUtil.kt adlı kişiyi aç.
  2. NotificationManager üzerinde cancelAll() 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()
}
  1. EggTimerViewModel.kt uygulamasını açıp startTimer() işlevine gidin.
  2. startTimer() içinde, sistemden NotificationManager örneğini alın ve cancelNotifications()'ı çağırın.
//  EggTimerViewModel.kt
   //TODO Step 1.15 call cancel notification
    val notificationManager =
       ContextCompat.getSystemService(
            app,
            NotificationManager::class.java
        ) as NotificationManager
    notificationManager.cancelNotifications()       
  1. Uygulamayı çalıştırın ve zamanlayıcıyı başlatın.
  2. 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.

  1. NotificationUtils.kt simgesini açıp sendNotification() işlevini bulun.
  2. resources simgesini kullanarak BitmapFactory 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
)
  1. Yeni bir BigPictureStyle oluşturun ve resminizi ayarlayın.
  2. Bildirim genişletildiğinde büyük simgenin kaybolması için bigLargeIcon() seçeneğini null 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)
  1. setStyle() ile stili bigPicStyle olarak ayarlayın.
  2. setLargeIcon() simgesini içeren büyük simgeyi eggImage 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)
  1. 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.

  1. SnoozeReceiver.kt adlı kişiyi aç. Bu sınıf, daha önce kullandığınız AlarmReceiver sınıfına benzer. Aşağıdaki adımlarda, SnoozeReceiver öğesinin onReceive() 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()
  1. SnoozeReceiver uygulamasını kullanmak için NotificationUtils.kt uygulamasını açın.
  2. sendNotification() işlevindeki stilden hemen sonra SnoozeReceiver için yeni bir Intent snoozeIntent oluşturun.
  3. Aşağıdaki adımlarda parametreleri bekleyen PendingIntent üzerinde getBroadcast() yöntemini çağırarak bekleyen bir intent oluşturun. Bu PendingIntent, 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.
  4. İlk parametre, bu PendingIntent öğesinin etkinliği başlatması gereken uygulama bağlamıdır.
  5. İ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.
  6. Ardından, başlatılacak etkinliğin amacı olan snoozeIntent nesnesini ekleyin.
  7. 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
)
  1. Ardından, notificationBuilder üzerinde addAction() işlevini çağırın. Bu işlev, kullanıcıya eyleminizi açıklayan bir simge ve metin bekler. Ayrıca snoozeIntent eklemeniz gerekir. Bu amaç, işleminiz tıklandığında doğru boadcastReceiver'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
)
  1. Erteleme işlemini test etmek için yumurta zamanlayıcı uygulamasını çalıştırın.
  2. 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).

IMPORTANCE_HIGH

PRIORITY_HIGH / PRIORITY_MAX

Ses çıkarır

IMPORTANCE_DEFAULT

PRIORITY_DEFAULT

Ses yok

IMPORTANCE_LOW

PRIORITY_LOW

Ses çıkarmaz ve durum çubuğunda görünmez.

IMPORTANCE_MIN

PRIORITY_MIN

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.

  1. Uygulamanızın bildirim kanalının önem düzeyini değiştirmek için EggTimerFragment.kt uygulamasını açıp createChannel() bölümüne gidin. Önem düzeyini IMPORTANCE_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.

  1. 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)
  1. 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.
  2. Ş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.

  1. 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)
    }
  1. 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.

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.