Bildirim oluşturma

Bildirimler, uygulamanız kullanılmadığında uygulamanızdaki etkinliklerle ilgili kısa ve zamanında bilgi sağlar. Bu dokümanda, çeşitli özelliklere sahip bir bildirimin nasıl oluşturulacağı gösterilmektedir. Bildirimlerin Android'de nasıl göründüğüne dair bir giriş için Bildirimlere genel bakış başlıklı makaleyi inceleyin. Bildirimleri kullanan örnek kod için GitHub'daki SociaLite örneğine bakın.

Bu sayfadaki kod, AndroidX Kitaplığı'ndaki NotificationCompat API'lerini kullanır. Bu API'ler, Android 9'a (API düzeyi 28) kadar geriye dönük uyumluluk sağlarken yalnızca Android'in daha yeni sürümlerinde kullanılabilen özellikleri eklemenize olanak tanır. Ancak satır içi yanıtlama işlemi gibi bazı özellikler, önceki sürümlerde işlem yapılmamasına neden olur.

AndroidX Core Library'i ekleme

Android Studio ile oluşturulan çoğu proje, NotificationCompat'ü kullanmak için gerekli bağımlılıkları içerir. Bununla birlikte, modül düzeyindeki build.gradle dosyanızın aşağıdaki bağımlılığı içerdiğini doğrulayın:

Groovy

dependencies {
    implementation "androidx.core:core:2.2.0"
}

Kotlin

dependencies {
    implementation("androidx.core:core-ktx:2.2.0")
}

Temel bildirim oluşturma

En basit ve kompakt biçimindeki (daraltılmış biçim olarak da bilinir) bildirimler bir simge, başlık ve az miktarda metin içeriği gösterir. Bu bölümde, kullanıcının uygulamanızda bir etkinlik başlatmak için dokunabileceği bir bildirimin nasıl oluşturulacağı gösterilmektedir.

Şekil 1. Simge, başlık ve metin içeren bir bildirim.

Bildirilerin her bir parçası hakkında daha fazla bilgi için bildirim anatomisi başlıklı makaleyi inceleyin.

Çalışma zamanı iznini beyan etme

Android 13 (API düzeyi 33) ve sonraki sürümler, bir uygulamadan muaf tutulmayan (ön plan hizmetleri (FGS) dahil) bildirimlerin yayınlanması için çalışma zamanı iznini destekler.

Uygulamanızın manifest dosyasında beyan etmeniz gereken izin aşağıdaki kod snippet'inde gösterilmektedir:

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

Çalışma zamanı izinleri hakkında daha fazla bilgi için Bildirim çalışma zamanı izni başlıklı makaleyi inceleyin.

Bildirim içeriğini ayarlama

Başlamak için bir NotificationCompat.Builder nesnesi kullanarak bildirimin içeriğini ve kanalını ayarlayın. Aşağıdaki örnekte, aşağıdakileri içeren bir bildirimin nasıl oluşturulacağı gösterilmektedir:

  • setSmallIcon() tarafından ayarlanan küçük bir simge. Kullanıcıların görebileceği tek zorunlu içerik budur.

  • setContentTitle() tarafından ayarlanan bir başlık.

  • setContentText() tarafından ayarlanan gövde metni.

  • setPriority() tarafından ayarlanan bildirim önceliği. Öncelik, Android 7.1 ve önceki sürümlerde bildirimin ne kadar müdahaleci olduğunu belirler. Android 8.0 ve sonraki sürümlerde, kanalın önemini aşağıdaki bölümde gösterildiği gibi ayarlayın.

Kotlin

var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle(textTitle)
        .setContentText(textContent)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)

Java

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle(textTitle)
        .setContentText(textContent)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);

NotificationCompat.Builder kurucusu, bir kanal kimliği sağlamanız gerekir. Bu, Android 8.0 (API düzeyi 26) ve sonraki sürümlerle uyumluluk için gereklidir ancak önceki sürümler tarafından yoksayılır.

Varsayılan olarak, bildirimin metin içeriği bir satıra sığacak şekilde kesilir. Genişletilebilir bildirim oluşturarak ek bilgiler gösterebilirsiniz.

Şekil 2. Daraltılmış ve genişletilmiş halleriyle genişletilebilir bildirim.

Bildiriminizin daha uzun olmasını isterseniz setStyle() içeren bir stil şablonu ekleyerek genişletilebilir bir bildirim etkinleştirebilirsiniz. Örneğin, aşağıdaki kod daha büyük bir metin alanı oluşturur:

Kotlin

var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Much longer text that cannot fit one line...")
        .setStyle(NotificationCompat.BigTextStyle()
                .bigText("Much longer text that cannot fit one line..."))
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)

Java

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Much longer text that cannot fit one line...")
        .setStyle(new NotificationCompat.BigTextStyle()
                .bigText("Much longer text that cannot fit one line..."))
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);

Resim ve medya oynatma denetimleri ekleme dahil olmak üzere diğer büyük bildirim stilleri hakkında daha fazla bilgi için Genişletilebilir bildirim oluşturma başlıklı makaleyi inceleyin.

Kanal oluşturma ve önemini ayarlama

Android 8.0 ve sonraki sürümlerde bildirimi yayınlayabilmeniz için NotificationChannel örneğini createNotificationChannel()'e göndererek uygulamanızın bildirim kanalını sisteme kaydedin. Aşağıdaki kod, SDK_INT sürümündeki bir koşul tarafından engellenir:

Kotlin

private fun createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is not in the Support Library.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val name = getString(R.string.channel_name)
        val descriptionText = getString(R.string.channel_description)
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
            description = descriptionText
        }
        // Register the channel with the system.
        val notificationManager: NotificationManager =
            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(channel)
    }
}

Java

private void createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is not in the Support Library.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviors after this.
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

Android 8.0 ve sonraki sürümlerde bildirim yayınlamadan önce bildirim kanalını oluşturmanız gerektiğinden, uygulamanız başlar başlamaz bu kodu yürütün. Mevcut bir bildirim kanalı oluşturmak herhangi bir işlem gerçekleştirmediği için bu işlevi tekrar tekrar çağırabilirsiniz.

NotificationChannel kurucusu, NotificationManager sınıfındaki sabitlerden birini kullanarak bir importance gerektirir. Bu parametre, bu kanala ait bildirimler için kullanıcının nasıl kesintiye uğratılabileceğini belirler. Android 7.1 ve önceki sürümleri desteklemek için önceki örnekte gösterildiği gibi setPriority() ile önceliği ayarlayın.

Bildirim önemini veya önceliğini aşağıdaki örnekte gösterildiği gibi ayarlamanız gerekir ancak sistem, alacağınız uyarı davranışını garanti etmez. Bazı durumlarda sistem, önem düzeyini diğer faktörlere göre değiştirebilir. Kullanıcılar, belirli bir kanalın önem düzeyini diledikleri zaman yeniden tanımlayabilir.

Farklı düzeylerin ne anlama geldiği hakkında daha fazla bilgi edinmek için bildirim önem düzeyleri hakkındaki makaleyi okuyun.

Bildirimin dokunma işlemini ayarlama

Her bildirim, dokunulduğunda genellikle uygulamanızda bildirime karşılık gelen bir etkinliği açacak şekilde yanıt vermelidir. Bunun için bir PendingIntent nesnesi ile tanımlanmış bir içerik amacı belirtin ve setContentIntent()'e iletin.

Aşağıdaki snippet'te, kullanıcı bildirime dokunduğunda bir etkinliği açmak için temel bir intent'in nasıl oluşturulacağı gösterilmektedir:

Kotlin

// Create an explicit intent for an Activity in your app.
val intent = Intent(this, AlertDetails::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)

val builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        // Set the intent that fires when the user taps the notification.
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)

Java

// Create an explicit intent for an Activity in your app.
Intent intent = new Intent(this, AlertDetails.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        // Set the intent that fires when the user taps the notification.
        .setContentIntent(pendingIntent)
        .setAutoCancel(true);

Bu kod, kullanıcı dokunduğunda bildirimi otomatik olarak kaldıran setAutoCancel() işlevini çağırır.

Önceki örnekte gösterilen setFlags() yöntemi, kullanıcının bildirimi kullanarak uygulamanızı açtıktan sonra beklediği gezinme deneyimini korur. Aşağıdakilerden biri olan başlattığınız etkinlik türüne bağlı olarak bu özelliği kullanabilirsiniz:

  • Yalnızca bildirime verilen yanıtlar için var olan bir etkinlik. Kullanıcının normal uygulama kullanımı sırasında bu etkinliğe gitmesi için bir neden yoktur. Bu nedenle etkinlik, uygulamanızın mevcut görev ve arka gruplarına eklenmek yerine yeni bir görev başlatır. Bu, önceki örnekte oluşturulan intent türüdür.

  • Uygulamanızın normal uygulama akışında bulunan bir etkinlik. Bu durumda, etkinliğin başlatılması, kullanıcının Geri ve Yukarı düğmeleriyle ilgili beklentilerinin korunması için bir geri yığın oluşturur.

Bildiriminizin amacını yapılandırmayla ilgili farklı yöntemler hakkında daha fazla bilgi için Bildirimden etkinlik başlatma başlıklı makaleyi inceleyin.

Bildirimi gösterme

Bildirimin görünmesi için NotificationManagerCompat.notify() işlevini çağırın. Bu işleve bildirim için benzersiz bir kimlik ve NotificationCompat.Builder.build() işlevinin sonucunu iletin. Bu durum aşağıdaki örnekte gösterilmektedir:

Kotlin

with(NotificationManagerCompat.from(this)) {
    if (ActivityCompat.checkSelfPermission(
            this@MainActivity,
            Manifest.permission.POST_NOTIFICATIONS
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        // TODO: Consider calling
        // ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        // public fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>,
        //                                        grantResults: IntArray)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.

        return@with
    }
    // notificationId is a unique int for each notification that you must define.
    notify(NOTIFICATION_ID, builder.build())
}

Java

with(NotificationManagerCompat.from(this)) {
   if (ActivityCompat.checkSelfPermission(
           this@MainActivity,
           Manifest.permission.POST_NOTIFICATIONS
       ) != PackageManager.PERMISSION_GRANTED
   ) {
       // TODO: Consider calling
       // ActivityCompat#requestPermissions
       // here to request the missing permissions, and then overriding
       // public void onRequestPermissionsResult(int requestCode, String[] permissions,
       //                                        int[] grantResults)
       // to handle the case where the user grants the permission. See the documentation
       // for ActivityCompat#requestPermissions for more details.

       return
   }
   // notificationId is a unique int for each notification that you must define.
   notify(NOTIFICATION_ID, builder.build())
}

NotificationManagerCompat.notify() parametresine ilettiğiniz bildirim kimliğini kaydedin. Bildirimi güncellemek veya kaldırmak istediğinizde bu kimliğe ihtiyacınız olacaktır.

Ayrıca, Android 13 ve sonraki sürümleri çalıştıran cihazlarda temel bildirimleri test etmek için bildirimleri manuel olarak açın veya bildirim isteğinde bulunmak için bir iletişim kutusu oluşturun.

İşlem düğmeleri ekleme

Bir bildirimde, kullanıcının hızlıca yanıt vermesine olanak tanıyan en fazla üç işlem düğmesi (ör. hatırlatıcıyı erteleme veya kısa mesajı yanıtlama) bulunabilir. Ancak bu işlem düğmeleri, kullanıcı bildirime dokunduğunda gerçekleştirilen işlemi yinelememelidir.

Şekil 3. Bir işlem düğmesi içeren bildirim.

İşlem düğmesi eklemek için addAction() yöntemine bir PendingIntent gönderin. Bu, bildirimin varsayılan dokunma işlemini ayarlamaya benzer. Bununla birlikte, bir etkinlik başlatmak yerine arka planda bir iş yapan bir BroadcastReceiver başlatmak gibi başka işlemler de yapabilirsiniz. Böylece, işlemin açık olan uygulamayı kesintiye uğratması önlenir.

Örneğin, aşağıdaki kodda belirli bir alıcıya nasıl yayın gönderileceği gösterilmektedir:

Kotlin

val ACTION_SNOOZE = "snooze"

val snoozeIntent = Intent(this, MyBroadcastReceiver::class.java).apply {
    action = ACTION_SNOOZE
    putExtra(EXTRA_NOTIFICATION_ID, 0)
}
val snoozePendingIntent: PendingIntent =
    PendingIntent.getBroadcast(this, 0, snoozeIntent, 0)
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent)

Java

String ACTION_SNOOZE = "snooze"

Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class);
snoozeIntent.setAction(ACTION_SNOOZE);
snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0);
PendingIntent snoozePendingIntent =
        PendingIntent.getBroadcast(this, 0, snoozeIntent, 0);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent);

Arka planda çalışma yürütmek için BroadcastReceiver oluşturma hakkında daha fazla bilgi için Yayınlara genel bakış başlıklı makaleyi inceleyin.

Bunun yerine, parçaları duraklatma ve atlama gibi medya oynatma düğmeleri içeren bir bildirim oluşturmaya çalışıyorsanız medya kontrolleri içeren bildirim oluşturma başlıklı makaleyi inceleyin.

Doğrudan yanıt işlemi ekleme

Android 7.0 (API düzeyi 24) sürümünde kullanıma sunulan doğrudan yanıt işlemi, kullanıcıların doğrudan bildirime metin girmelerine olanak tanır. Ardından, kısa mesaj bir etkinlik açılmadan uygulamanıza gönderilir. Örneğin, kullanıcıların bildirim içinden kısa mesajları yanıtlamasına veya görev listelerini güncellemesine izin vermek için doğrudan yanıt işlemini kullanabilirsiniz.

Şekil 4. "Yanıtla" düğmesine dokunduğunuzda metin girişi açılır.

Doğrudan yanıtlama işlemi, bildirimde metin girişi açan ek bir düğme olarak görünür. Kullanıcı yazma işlemini tamamladığında sistem, metin yanıtını bildirim işlemi için belirttiğiniz intent'e ekler ve intent'i uygulamanıza gönderir.

Yanıt düğmesini ekleme

Doğrudan yanıtı destekleyen bir bildirim işlemi oluşturmak için aşağıdaki adımları uygulayın:

  1. Bildirim işleminize ekleyebileceğiniz bir RemoteInput.Builder sınıfı örneği oluşturun. Bu sınıfın kurucusu, sistemin metin girişi için anahtar olarak kullandığı bir dize kabul eder. Uygulamanız daha sonra giriş metnini almak için bu anahtarı kullanır.

    Kotlin

      // Key for the string that's delivered in the action's intent.
      private val KEY_TEXT_REPLY = "key_text_reply"
      var replyLabel: String = resources.getString(R.string.reply_label)
      var remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run {
          setLabel(replyLabel)
          build()
      }
      

    Java

      // Key for the string that's delivered in the action's intent.
      private static final String KEY_TEXT_REPLY = "key_text_reply";
    
      String replyLabel = getResources().getString(R.string.reply_label);
      RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
              .setLabel(replyLabel)
              .build();
      
  2. Yanıt işlemi için bir PendingIntent oluşturun.

    Kotlin

      // Build a PendingIntent for the reply action to trigger.
      var replyPendingIntent: PendingIntent =
          PendingIntent.getBroadcast(applicationContext,
              conversation.getConversationId(),
              getMessageReplyIntent(conversation.getConversationId()),
              PendingIntent.FLAG_UPDATE_CURRENT)
      

    Java

      // Build a PendingIntent for the reply action to trigger.
      PendingIntent replyPendingIntent =
              PendingIntent.getBroadcast(getApplicationContext(),
                      conversation.getConversationId(),
                      getMessageReplyIntent(conversation.getConversationId()),
                      PendingIntent.FLAG_UPDATE_CURRENT);
      
  3. RemoteInput nesnesini addRemoteInput() kullanarak bir işleme ekleyin.

    Kotlin

      // Create the reply action and add the remote input.
      var action: NotificationCompat.Action =
          NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
              getString(R.string.label), replyPendingIntent)
              .addRemoteInput(remoteInput)
              .build()
      

    Java

      // Create the reply action and add the remote input.
      NotificationCompat.Action action =
              new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
                      getString(R.string.label), replyPendingIntent)
                      .addRemoteInput(remoteInput)
                      .build();
      
  4. İşlemi bir bildirime uygulayın ve bildirimi gönderin.

    Kotlin

      // Build the notification and add the action.
      val newMessageNotification = Notification.Builder(context, CHANNEL_ID)
              .setSmallIcon(R.drawable.ic_message)
              .setContentTitle(getString(R.string.title))
              .setContentText(getString(R.string.content))
              .addAction(action)
              .build()
    
      // Issue the notification.
      with(NotificationManagerCompat.from(this)) {
          notificationManager.notify(notificationId, newMessageNotification)
      }
      

    Java

      // Build the notification and add the action.
      Notification newMessageNotification = new Notification.Builder(context, CHANNEL_ID)
              .setSmallIcon(R.drawable.ic_message)
              .setContentTitle(getString(R.string.title))
              .setContentText(getString(R.string.content))
              .addAction(action)
              .build();
    
      // Issue the notification.
      NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
      notificationManager.notify(notificationId, newMessageNotification);
      

Sistem, kullanıcı bildirim işlemini tetiklediğinde ondan bir yanıt girmesini ister (Şekil 4).

Yanıttan kullanıcı girişini alma

Bildirimin yanıt kullanıcı arayüzünden kullanıcı girişi almak için RemoteInput.getResultsFromIntent() işlevini çağırın ve BroadcastReceiver tarafından alınan Intent değerini iletin:

Kotlin

private fun getMessageText(intent: Intent): CharSequence? {
    return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY)
}

Java

private CharSequence getMessageText(Intent intent) {
    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
    if (remoteInput != null) {
        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
    }
    return null;
 }

Metni işledikten sonra, aynı kimlik ve etiketle (kullanılıyorsa) NotificationManagerCompat.notify()'ü çağırarak bildirimi güncelleyin. Bu, doğrudan yanıt kullanıcı arayüzünü gizlemek ve kullanıcıya yanıtının alındığını ve doğru şekilde işlendiğini onaylamak için gereklidir.

Kotlin

// Build a new notification, which informs the user that the system
// handled their interaction with the previous notification.
val repliedNotification = Notification.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_message)
        .setContentText(getString(R.string.replied))
        .build()

// Issue the new notification.
NotificationManagerCompat.from(this).apply {
    notificationManager.notify(notificationId, repliedNotification)
}

Java

// Build a new notification, which informs the user that the system
// handled their interaction with the previous notification.
Notification repliedNotification = new Notification.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_message)
        .setContentText(getString(R.string.replied))
        .build();

// Issue the new notification.
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(notificationId, repliedNotification);

Bu yeni bildirimle çalışırken alıcının onReceive() yöntemine iletilen içeriği kullanın.

setRemoteInputHistory() simgesini kullanarak yanıtı bildirimin alt kısmına ekleyin. Ancak bir mesajlaşma uygulaması geliştiriyorsanız mesajlaşma tarzında bir bildirim oluşturun ve yeni mesajı görüşmeye ekleyin.

Mesajlaşma uygulamalarından gelen bildirimler hakkında daha fazla bilgi için mesajlaşma uygulamalarıyla ilgili en iyi uygulamalar bölümüne bakın.

İlerleme çubuğu ekleme

Bildirimler, kullanıcılara devam eden bir işlemin durumunu gösteren animasyonlu bir ilerleme göstergesi içerebilir.

Şekil 5. Bir işlem sırasındaki ilerleme çubuğu.

İşlemin ne kadarının tamamlandığını tahmin edebiliyorsanız setProgress(max, progress, false) işlevini çağırarak göstergenin "belirleyici" biçimini (şekil 5'te gösterildiği gibi) kullanın. İlk parametre, "tamamlandı" değerinin ne olduğunu belirtir (ör. 100). İkincisi, ne kadarının tamamlandığıdır. Sonuncusu, bunun belirli bir ilerleme çubuğu olduğunu gösterir.

İşleminiz devam ederken progress için güncellenmiş bir değerle setProgress(max, progress, false) işlevini sürekli olarak çağırın ve aşağıdaki örnekte gösterildiği gibi bildirimi yeniden yayınlayın.

Kotlin

val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
    setContentTitle("Picture Download")
    setContentText("Download in progress")
    setSmallIcon(R.drawable.ic_notification)
    setPriority(NotificationCompat.PRIORITY_LOW)
}
val PROGRESS_MAX = 100
val PROGRESS_CURRENT = 0
NotificationManagerCompat.from(this).apply {
    // Issue the initial notification with zero progress.
    builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false)
    notify(notificationId, builder.build())

    // Do the job that tracks the progress here.
    // Usually, this is in a worker thread.
    // To show progress, update PROGRESS_CURRENT and update the notification with:
    // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
    // notificationManager.notify(notificationId, builder.build());

    // When done, update the notification once more to remove the progress bar.
    builder.setContentText("Download complete")
            .setProgress(0, 0, false)
    notify(notificationId, builder.build())
}

Java

...
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentTitle("Picture Download")
        .setContentText("Download in progress")
        .setSmallIcon(R.drawable.ic_notification)
        .setPriority(NotificationCompat.PRIORITY_LOW);

// Issue the initial notification with zero progress.
int PROGRESS_MAX = 100;
int PROGRESS_CURRENT = 0;
builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
notificationManager.notify(notificationId, builder.build());

// Do the job that tracks the progress here.
// Usually, this is in a worker thread.
// To show progress, update PROGRESS_CURRENT and update the notification with:
// builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
// notificationManager.notify(notificationId, builder.build());

// When done, update the notification once more to remove the progress bar.
builder.setContentText("Download complete")
        .setProgress(0,0,false);
notificationManager.notify(notificationId, builder.build());

İşlemin sonunda progress, max'a eşit olmalıdır. İşlemin tamamlandığını göstermek için ilerleme çubuğunu bırakabilir veya kaldırabilirsiniz. Her iki durumda da bildirim metnini, işlemin tamamlandığını gösterecek şekilde güncelleyin. İlerleme çubuğunu kaldırmak için setProgress(0, 0, false) numaralı telefonu arayın.

Belirsiz bir ilerleme çubuğu (tamamlanma yüzdesini göstermeyen bir çubuk) görüntülemek için setProgress(0, 0, true) işlevini çağırın. Sonuç, önceki ilerleme çubuğuyla aynı stile sahip bir göstergedir. Tek fark, tamamlanmayı göstermeyen sürekli bir animasyon olmasıdır. İlerleme animasyonu, setProgress(0, 0, false)'yi çağırıp bildirimi etkinlik göstergesinden arındıracak şekilde güncelleyene kadar çalışır.

Bildirim metnini, işlemin tamamlandığını belirtecek şekilde değiştirmeyi unutmayın.

Sistem genelinde bir kategori ayarlama

Android, kullanıcı Rahatsız Etme modunu etkinleştirdiğinde kullanıcıyı belirli bir bildirimle rahatsız edip etmeyeceği belirlemek için sistem genelinde önceden tanımlanmış kategorileri kullanır.

Bildiriminiz NotificationCompat'te tanımlanan bildirim kategorilerinden birine (ör. CATEGORY_ALARM, CATEGORY_REMINDER, CATEGORY_EVENT veya CATEGORY_CALL) aitse uygun kategoriyi setCategory()'ye ileterek bildirimi bu kategoride olduğunu belirtin:

Kotlin

var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE)

Java

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE);

Sistem, cihaz Rahatsız Etmeyin modundayken bildiriminizi gösterme konusunda karar vermek için bildirim kategorinizle ilgili bu bilgileri kullanır. Ancak sistem genelinde bir kategori belirlemeniz gerekmez. Yalnızca bildirimleriniz NotificationCompat içinde tanımlanan kategorilerden biriyle eşleşiyorsa bunu yapın.

Acil mesaj gösterme

Uygulamanızın, gelen telefon araması veya çalan alarm gibi acil ve zamana duyarlı bir mesaj göstermesi gerekebilir. Bu gibi durumlarda, bildiriminizle tam ekran intent'i ilişkilendirebilirsiniz.

Bildirim tetiklendiğinde kullanıcılar, cihazın kilit durumuna bağlı olarak aşağıdakilerden birini görür:

  • Kullanıcının cihazı kilitliyse kilit ekranını kaplayan tam ekran bir etkinlik gösterilir.
  • Kullanıcının cihazının kilidi açıksa bildirim, bildirimi işleme veya kapatma seçeneklerini içeren genişletilmiş bir biçimde görünür.

Aşağıdaki kod snippet'inde, bildiriminizin tam ekran intent ile nasıl ilişkilendirileceği gösterilmektedir:

Kotlin

val fullScreenIntent = Intent(this, ImportantActivity::class.java)
val fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
    fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT)

var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setFullScreenIntent(fullScreenPendingIntent, true)

Java

Intent fullScreenIntent = new Intent(this, ImportantActivity.class);
PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
        fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setFullScreenIntent(fullScreenPendingIntent, true);

Kilit ekranının görünürlüğünü ayarlama

Kilit ekranındaki bildirimde gösterilen ayrıntı düzeyini kontrol etmek için setVisibility() kodunu arayın ve aşağıdaki değerlerden birini belirtin:

  • VISIBILITY_PUBLIC: Bildirimin tam içeriği kilit ekranında gösterilir.

  • VISIBILITY_SECRET: Bildirimin hiçbir kısmı kilit ekranında gösterilmez.

  • VISIBILITY_PRIVATE: Kilit ekranında yalnızca bildirimin simgesi ve içerik başlığı gibi temel bilgiler gösterilir. Bildirimin tam içeriği gösterilmiyor.

VISIBILITY_PRIVATE değerini ayarlarken bildirim içeriğinin belirli ayrıntıları gizleyen alternatif bir sürümünü de sağlayabilirsiniz. Örneğin, bir SMS uygulaması "3 yeni kısa mesajınız var" yazan bir bildirim gösterebilir ancak mesaj içeriklerini ve gönderenleri gizleyebilir. Bu alternatif bildirimi sağlamak için önce her zamanki gibi NotificationCompat.Builder ile alternatif bildirimi oluşturun. Ardından, alternatif bildirimi setPublicVersion() ile normal bildirime ekleyin.

Kullanıcının, bildirimlerinin kilit ekranında görünür olup olmayacağı konusunda her zaman nihai kontrole sahip olduğunu ve bunları uygulamanızın bildirim kanallarına göre kontrol edebileceğini unutmayın.

Bildirimleri güncelleme

Gönderdiğiniz bir bildirimi güncellemek için NotificationManagerCompat.notify() işlevini daha önce kullandığınız kimliği ile tekrar çağırın. Önceki bildirim kapatılırsa bunun yerine yeni bir bildirim oluşturulur.

İsteğe bağlı olarak setOnlyAlertOnce() değerini çağırarak bildiriminizin kullanıcıyı yalnızca ilk kez göründüğünde (sonraki güncellemelerde değil) ses, titreşim veya görsel ipuçlarıyla kesintiye uğratmasını sağlayabilirsiniz.

Bildirimleri kaldırma

Bildirimler aşağıdakilerden biri gerçekleşene kadar görünür kalır:

  • Kullanıcı bildirimi kapatır.
  • Bildirimi oluştururken setAutoCancel() çağrısı yaparsanız kullanıcı bildirime dokunur.
  • Belirli bir bildirim kimliği için cancel() işlevini çağırırsınız. Bu yöntem, devam eden bildirimleri de siler.
  • cancelAll() çağrısı yaptığınızda daha önce gönderdiğiniz tüm bildirimler kaldırılır.
  • Bildirimi oluştururken setTimeoutAfter() kullanarak bir zaman aşımı ayarlarsanız belirtilen süre dolar. Gerekirse bir bildirimi, belirtilen zaman aşımı süresi dolmadan iptal edebilirsiniz.

Mesajlaşma uygulamaları için en iyi uygulamalar

Mesajlaşma ve sohbet uygulamalarınız için bildirim oluştururken burada listelenen en iyi uygulamalardan yararlanın.

MessagingStyle'ı kullanma

Android 7.0 (API düzeyi 24) sürümünden itibaren Android, mesajlaşma içeriği için özel olarak bir bildirim stili şablonu sağlar. NotificationCompat.MessagingStyle sınıfını kullanarak bildirimde gösterilen etiketlerden bazılarını (ör. ileti dizisi başlığı, ek mesajlar ve bildirimin içerik görünümü) değiştirebilirsiniz.

Aşağıdaki kod snippet'inde, MessagingStyle sınıfı kullanılarak bir bildirimin stilinin nasıl özelleştirileceği gösterilmektedir.

Kotlin

val user = Person.Builder()
    .setIcon(userIcon)
    .setName(userName)
    .build()

val notification = NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("2 new messages with $sender")
    .setContentText(subject)
    .setSmallIcon(R.drawable.new_message)
    .setStyle(NotificationCompat.MessagingStyle(user)
        .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson())
        .addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson())
    )
    .build()

Java

Person user = new Person.Builder()
    .setIcon(userIcon)
    .setName(userName)
    .build();

Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("2 new messages with " + sender)
    .setContentText(subject)
    .setSmallIcon(R.drawable.new_message)
    .setStyle(new NotificationCompat.MessagingStyle(user)
        .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson())
        .addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson())
    )
    .build();

Android 9.0 (API düzeyi 28) sürümünden itibaren, bildirimin ve avatarlarının optimal bir şekilde oluşturulması için Person sınıfının da kullanılması gerekir.

NotificationCompat.MessagingStyle kullanırken aşağıdakileri yapın:

  • İkiden fazla kişinin bulunduğu grup sohbetlerine başlık eklemek için MessagingStyle.setConversationTitle() simgesine dokunun. Grup sohbetinin adı veya adı yoksa sohbetteki katılımcıların listesi iyi bir görüşme başlığı olabilir. Bu olmadan mesaj, görüşmedeki en son mesajın göndereniyle bire bir görüşmeye aitmiş gibi yanlış anlaşılabilir.
  • Resim gibi medya mesajları eklemek için MessagingStyle.setData() yöntemini kullanın. image/* kalıbının MIME türleri desteklenir.

Doğrudan yanıt özelliğini kullanma

Doğrudan yanıt, kullanıcıların mesajları satır içinde yanıtlamasına olanak tanır.

  • Kullanıcı satır içi yanıt işlemiyle yanıt verdikten sonra MessagingStyle bildirimini güncellemek için MessagingStyle.addMessage() simgesini kullanın ve bildirimi geri çekmeyin veya iptal etmeyin. Bildirimi iptal etmemek, kullanıcının bildirim üzerinden birden fazla yanıt göndermesine olanak tanır.
  • Satır içi yanıtlama işlemini Wear OS ile uyumlu hale getirmek için Action.WearableExtender.setHintDisplayInlineAction(true) işlevini çağırın.
  • Bildirime geçmiş mesajlar ekleyerek doğrudan yanıt verilen bir görüşmeye bağlam sağlamak için addHistoricMessage() yöntemini kullanın.

Akıllı Yanıt'ı etkinleştirme

  • Akıllı Yanıt'ı etkinleştirmek için yanıt işleminde setAllowGeneratedResponses(true) simgesini çağırın. Bu sayede, bildirim bir Wear OS cihazına köprülendiğinde kullanıcılar Akıllı Yanıt yanıtlarını görebilir. Akıllı Yanıt yanıtları, NotificationCompat.MessagingStyle bildirimi tarafından sağlanan bağlamı kullanan tamamen izleme modundaki bir makine öğrenimi modeli tarafından oluşturulur ve yanıtları oluşturmak için internete hiçbir veri yüklenmez.

Bildirim meta verilerini ekleme