Android Bildirimlerini Kullanma

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.

Zip'i İndir

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

  1. Kaynak kodunu 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çerir. Kullanıcı tarafından tanımlanan zamanlayıcı dolduğunda AlarmReceiver, bildirimi göndermek için AlarmManager 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örevlerinden EggTimerViewModel sorumludur.
  • /util: Bu pakette iki dosya bulunur. BindingUtils.kt, uygulama kullanıcı arayüzü ile ViewModel 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.

  1. NotificationUtils.kt sınıfını açın ve TODO: Step 1.1 ifadesini bulun. Eşleşen yapılacaklar listesini bu codelab'de ve uygulama kodunda bulabilirsiniz.
  2. Belirtilen sendNotification() işlevini inceleyin. Bu uzantı işlevini NotificationManager 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) {
  1. 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)
)
  1. 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)
  1. Daha sonra, bildiriminiz için benzersiz bir kimlik ve oluşturucunuzdaki Notification nesnesiyle birlikte notify() ç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())
  1. ui/EggTimerViewModel.kt işlevini açın ve startTimer() 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.
  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ğ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, sistemden NotificationManager ürününün bir örneğini istemeniz gerekir. Bildirim mesajı ve bağlamla birlikte 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 bitti. 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" 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.

  1. EggTimerFragment.kt işlevini açın ve createChannel() işlevini bulun.
  2. Benzersiz kanal kimliğini NotificationChannel sitesinin oluşturucusuna iletin.
  3. Kullanıcıların, Ayarlar ekranında da görecekleri bildirim kanalı adını iletin.
  4. 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 NotificationManager.IMPORTANCE_LOW ürününü kullanabilirsiniz.
  5. notificationChannel nesnesinde enableLights değerini true olarak ayarlayın. Bu ayar, bir bildirim gösterildiğinde ışıkları etkinleştirir.
  6. Bildirim gösterildiğinde kırmızı ışık göstermek için notificationChannel nesnesinde lightColor öğesini 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() çağırarak NotificationManager örneğini alın.
  10. NotificationManager öğesinde createNotificationChannel() öğesini ç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. 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)
    )
  1. 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)
)
  1. 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.
  2. 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.
  3. Yeni oluşturulan kanalı doğrulamak için uygulamayı kapatıp uygulama simgesini bulun. Uygulama simgesine uzun dokunduktan sonra Uygulama bilgileri'ni seçin.

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

  1. NotificationManager öğesinin bir örneği olan AlarmReceiver.kt öğesini açın ve mesaj metni ve bağlam parametreleriyle sendNotification() 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
   )
  1. İ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()
  1. 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.

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

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

  1. NotificationUtils.kt öğesini açıp sendNotification() uzantı işlevini bulun.
  2. applicationContext ve başlatılacak etkinliğiniz olan MainActivity::class.java ile 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)

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.

  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 etiketi kullanma seçeneğini belirtir. Mevcut bir bildirim varsa yeni bir bildirim oluşturmak istemediğiniz için bunu PendingIntent.FLAG_UPDATE_CURRENT işareti olarak ayarlamanız gerekir. Bu şekilde, belirttiğiniz niyetle ilişkili olan mevcut PendingIntent ü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
    )
  1. PendingIntent bildirimini bildiriminize iletin. Bunu, NotificationBuilder üzerinde setContentIntent() numaralı telefonu arayarak yapabilirsiniz. Artık bildirimi tıkladığınızda PendingIntent tetiklenecek ve MainActivity cihazınız açılacak.
  2. Ayrıca, setAutoCancel()'yi true 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)
  1. Uygulamayı tekrar çalıştırın.
  2. Zamanlayıcı ayarlayın, uygulamayı arka plana koyun 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ı 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.

  1. NotificationsUtil.kt'yi açın.
  2. NotificationManager öğesine cancelAll() ç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()
}
  1. EggTimerViewModel.kt işlevini açın ve startTimer() işlevine gidin.
  2. startTimer() içinde, sistemden NotificationManager örneğini alın ve cancelNotifications() ç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()       
  1. Uygulamayı çalıştırıp zamanlayıcıyı başlatın.
  2. 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.

  1. NotificationUtils.kt işlevini açın ve sendNotification() işlevini bulun.
  2. BitmapFactory yardımıyla resources 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
)
  1. Yeni bir BigPictureStyle oluşturun ve resminizi ayarlayın.
  2. Bildirim genişletildiğinde büyük simgenin kaybolması için bigLargeIcon() değerini 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. Stili setStyle() ile bigPicStyle olarak ayarlayın.
  2. setLargeIcon() içeren büyük simgeyi eggImage 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)
  1. 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.

  1. SnoozeReceiver.kt'yi açın. Bu ders, daha önce kullandığınız AlarmReceiver ile benzer. Aşağıdaki adımlarda, SnoozeReceiver öğesinin onReceive() 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()
  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. PendingIntent adımında getBroadcast() yöntemini çağırarak beklemedeki bir niyet oluşturun. Bunu yapmak için aşağıdaki adımlarda parametreleri bekleyin. Bu PendingIntent, 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.
  4. İlk parametre, bu PendingIntent öğesinin başlaması gereken uygulama bağlamıdır.
  5. İ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.
  6. Sonra, başlatılacak etkinliğin amacı olan snoozeIntent nesnesini ekleyin.
  7. 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
)
  1. Ardından, notificationBuilder içinde addAction() işlevini çağırın. Bu işlevde, kullanıcıya işleminizi açıklayan bir simge ve metin beklenir. Ayrıca snoozeIntent eklemeniz gerekir. Bu amaç, işleminiz tıklandığında doğru boadcastReceiver 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 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)

IMPORTANCE_HIGH

PRIORITY_HIGH / PRIORITY_MAX

Ses çıkarıyor

IMPORTANCE_DEFAULT

PRIORITY_DEFAULT

Sessiz

IMPORTANCE_LOW

PRIORITY_LOW

Ses yok ve durum çubuğunda görünmüyor

IMPORTANCE_MIN

PRIORITY_MIN

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.

  1. Uygulamanızın bildirim kanalının önem düzeyini değiştirmek için EggTimerFragment.kt uygulamasını açın ve createChannel() sayfasına gidin. Önem düzeyini IMPORTANCE_LOW yerine IMPORTANCE_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.

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

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

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.