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 Kişiler örneğine göz atı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 yapmaz.

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 temel 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 bölümü 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 bölümüne bakın.

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, bunun yerine kanal önemini bir sonraki 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 kontrolleri ekleme gibi diğer büyük bildirim stilleri hakkında daha fazla bilgi edinmek için Genişletilebilir bildirim oluşturma bölümüne bakın.

Kanal oluşturma ve önemini ayarlama

Bildirimi Android 8.0 ve sonraki sürümlerde teslim etmeden önce bir NotificationChannel örneğini createNotificationChannel()'e ileterek 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 kullanan bir importance gerektirir. Bu parametre, bu kanala ait bildirimler için kullanıcının nasıl kesintiye uğratılacağını 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 bildirimin, genellikle uygulamanızda bildirime karşılık gelen bir etkinliği açmak için bir dokunmaya yanıt vermesi gerekir. 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 otomatik olarak bildirimi 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 gitmesinin bir nedeni yoktur. Bu nedenle etkinlik, uygulamanızın mevcut göreve ve geri yığını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, etkinlik başlatıldığında bir arka yığın oluşturulur, böylece kullanıcının Geri ve Yukarı düğmeleriyle ilgili beklentileri korunur.

Bildiriminizin amacını yapılandırmanın farklı yolları hakkında daha fazla bilgi için Bildirimden Etkinlik Başlatma bölümüne bakın.

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 istemek 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 olan bir bildirim.

İşlem düğmesi eklemek için addAction() yöntemine bir PendingIntent gönderin. Bu işlem, bildirimin varsayılan dokunma işlemini ayarlamaya benzer. Ancak bir etkinlik başlatmak yerine, arka planda bir iş gerçekleştiren BroadcastReceiver gibi başka işlemler gerçekleştirebilirsiniz. Böylece bu işlem, halihazırda açık olan uygulamayı kesintiye uğratmaz.

Ö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 plan çalışması çalıştırmak üzere BroadcastReceiver oluşturma hakkında daha fazla bilgi için Yayınlara genel bakış bölümüne bakın.

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. Metin daha sonra herhangi bir etkinlik açılmadan uygulamanıza iletilir. Örneğin, kullanıcıların bildirim içinden kısa mesajları yanıtlamasını veya görev listelerini güncellemesini sağlamak için doğrudan yanıt işlemi 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 oluşturucusu, sistemin metin girişi için anahtar olarak kullandığı bir dizeyi 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. addRemoteInput() kullanarak RemoteInput nesnesini 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ıp bildirim 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 kullanıcıdan 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.

5. Şekil. İşlem sırasında gösterilen 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üncel bir değerle setProgress(max, progress, false) öğesini sürekli olarak çağırın ve aşağıdaki örnekte gösterildiği gibi bildirimi yeniden gönderin.

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. İlerleme çubuğunu, işlemin tamamlandığını belirtmek veya kaldırmak için kullanabilirsiniz. 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 kaldırana kadar çalışır.

İşlemin tamamlandığını belirtmek için bildirim metnini değiştirmeyi unutmayın.

Sistem genelinde bir kategori belirleyin

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 modunda olduğunda bildiriminizin görüntülenmesi hakkında karar vermek için bildirim kategorinizle ilgili bu bilgileri kullanır. Ancak sistem genelinde bir kategori belirlemeniz gerekmez. Yalnızca bildirimleriniz NotificationCompat tarafından 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 bölümü kilit ekranında gösterilmez.

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

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ında "3 yeni kısa mesajınız var" şeklinde bir bildirim görüntülenebilir ancak mesaj içerikleri ve gönderenleri gizlenir. 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

Bir bildirimi yayınladıktan sonra güncellemek için daha önce kullandığınız kimliği ileterek NotificationManagerCompat.notify() numaralı telefonu tekrar arayı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.

Bildirimi 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 optimum şekilde oluşturulması için Person sınıfının kullanılması da gereklidir.

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. İyi bir konuşma başlığı, grup sohbetinin adı veya bir adı yoksa sohbetteki katılımcıların listesi olabilir. Bu olmadan, mesaj görüşmedeki en son mesajın göndereniyle bire bir görüşmeye ait olarak 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ıtladığınız 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