Bildirim oluşturma

Bildirimler, uygulamanızdaki etkinlikler hakkında kısa ve zamanında bilgiler sağlar. Bu dokümanda, çeşitli özelliklere sahip bir bildirimi nasıl oluşturacağınız açıklanmaktadır. Bildirimlerin Android'de nasıl göründüğüne dair tanıtım için Bildirimlere genel bakış konusuna bakın. Bildirimleri kullanan örnek kod için GitHub'daki Kişiler örneğine bakın.

Bu sayfadaki kod, AndroidX Kitaplığı'ndaki NotificationCompat API'lerini kullanır. Bu API'ler yalnızca Android'in yeni sürümlerinde bulunan özellikleri eklemenize olanak tanırken aynı zamanda Android 9'a (API düzeyi 28) uyumluluk sağlamaya devam eder. Ancak satır içi yanıt işlemi gibi bazı özellikler önceki sürümlerde uygulamanın devre dışı bırakılmasına neden olur.

AndroidX Core Kitaplığı'nı ekleme

Android Studio ile oluşturulan çoğu projede NotificationCompat kullanımı için gerekli bağımlılıklar bulunsa da modül düzeyindeki build.gradle dosyanızın aşağıdaki bağımlılığı içerdiğini doğrulayın:

Eski

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

Kotlin

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

Temel bildirim oluşturma

Daraltılmış biçim olarak da bilinen en temel ve kompakt biçimdeki bir bildirim bir simge, bir başlık ve az miktarda metin içeriği görüntüler. Bu bölümde, kullanıcının uygulamanızda bir etkinlik başlatmak için dokunabileceği bildirimin nasıl oluşturulacağı gösterilmektedir.

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

Bir bildirimin her bölümü hakkında daha fazla ayrıntı için bildirim anatomisi hakkında bilgi edinin.

Çalışma zamanında istenen izni beyan etme

Android 13 (API düzeyi 33) ve sonraki sürümler, bir uygulamadan muaf olmayan (Ön Plan Hizmeti (FGS) dahil) bildirimleri yayınlamak için çalışma zamanında istenen izni destekler.

Uygulamanızın manifest dosyasında beyan etmeniz gereken izin, şu kod snippet'inde görünür:

<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 bildirimin içeriğini ve kanalını NotificationCompat.Builder nesnesi kullanarak 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, gerekli olan tek 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 rahatsız edici 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 oluşturucusu, bir kanal kimliği sağlamanızı gerektirir. 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 kısaltılır. Genişletilebilir bir bildirim oluşturarak ek bilgiler gösterebilirsiniz.

Şekil 2. Daraltılmış ve genişletilmiş biçimlerinde genişletilebilir bir bildirim.

Bildiriminizin daha uzun olmasını istiyorsanız setStyle() ile stil şablonu ekleyerek genişletilebilir bildirimi etkinleştirebilirsiniz. Örneğin, aşağıdaki kod daha geniş 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şturun ve önem verdiğinizi belirleyin

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şturma işlemi hiçbir işlem gerçekleştirmeyeceğinden bu komutu tekrar tekrar çağırmak güvenlidir.

NotificationChannel oluşturucusu, NotificationManager sınıfındaki sabit değerlerden birini kullanan bir importance gerektirir. Bu parametre, bu kanala ait herhangi bir bildirim için kullanıcının nasıl kesintiye uğrayacağını belirler. Önceki örnekte gösterildiği gibi, Android 7.1 ve önceki sürümleri desteklemek için önceliği setPriority() olarak ayarlayın.

Bildirim önem derecesini veya önceliğini aşağıdaki örnekte gösterildiği gibi ayarlamanız gerekse de sistem, alacağınız uyarının davranışını garanti etmez. Bazı durumlarda sistem, önem düzeyini başka faktörlere bağlı olarak değiştirebilir ve kullanıcı belirli bir kanalın önem düzeyini istediği 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 bilgileri 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 PendingIntent nesnesiyle tanımlanmış bir içerik amacı belirtin ve bunu setContentIntent() öğesine iletin.

Aşağıdaki snippet'te, kullanıcı bildirime dokunduğunda bir etkinlik açmak için temel niyetin 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 setAutoCancel() yöntemini çağırır. Bu işlem, kullanıcı dokunduğunda bildirimi otomatik olarak kaldırır.

Yukarıdaki örnekte gösterilen setFlags() yöntemi, kullanıcının bildirimi kullanarak uygulamanızı açtıktan sonra göstermesi beklenen gezinme deneyimini korur. Başlattığınız etkinliğin türüne bağlı olarak bu özelliği kullanmak isteyebilirsiniz. Bu tür etkinliklerden biri olabilir:

  • Özel olarak bildirime verilen yanıtlar için mevcut olan bir etkinlik. Kullanıcının normal uygulama kullanımı sırasında bu etkinliğe gitmesinin bir nedeni yoktur. Dolayısıyla 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 amaç türüdür.

  • Uygulamanızın normal uygulama akışında bulunan 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öster

Bildirimin görünmesini sağlamak için NotificationManagerCompat.notify() numaralı telefonu çağırarak bildirim için ve NotificationCompat.Builder.build() sonucunun benzersiz bir kimliği iletin. Bu, 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() hizmetine ilettiğiniz bildirim kimliğini kaydedin. Bildirimi güncellemek veya kaldırmak istediğinizde bu kimlik gereklidir.

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 ekleyin

Bir bildirimde, kullanıcının hızlı yanıt vermesini sağlayan (örneğin, bir hatırlatıcıyı ertelemek veya bir kısa mesajı yanıtlamak için) üç işlem düğmesi sunulabilir. Ancak bu işlem düğmeleri, kullanıcı bildirime dokunduğunda gerçekleştirilen işlemin kopyasını oluşturmamalıdır.

Şekil 3. Bir işlem düğmesi olan bir bildirim.

İşlem düğmesi eklemek için addAction() yöntemine PendingIntent iletin. 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 de yapabilirsiniz. Böylece bu işlem, halihazırda açık olan uygulamayı kesintiye uğratmaz.

Örneğin, aşağıdaki kodda bir yayının belirli bir alıcıya nasıl 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ı duraklatmak ve atlamak gibi medya oynatma düğmeleriyle bir bildirim oluşturmaya çalışıyorsanız medya denetimleriyle nasıl bildirim oluşturabileceğinizi öğrenin.

Doğrudan yanıt işlemi ekleyin

Android 7.0'da (API düzeyi 24) kullanıma sunulan doğrudan yanıtlama işlemi, kullanıcıların bildirime doğrudan metin girmesini sağlar. 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.

4.Şekil "Yanıtla" düğmesine dokunulduğunda 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ı yazmayı bitirdiğinde sistem, metin yanıtını bildirim işlemi için belirttiğiniz amaca ekler ve niyeti uygulamanıza gönderir.

Yanıtla düğmesini ekleme

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

  1. Bildirim işleminize ekleyebileceğiniz bir RemoteInput.Builder ö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 tuşu 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ıtlama 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);
      

Şekil 4'te gösterildiği gibi, bildirim işlemi tetiklendiğinde sistem kullanıcıdan bir yanıt girmesini ister.

Yanıttan kullanıcı girişini alma

Bildirimin yanıt kullanıcı arayüzünden kullanıcı girişi almak için RemoteInput.getResultsFromIntent() çağrısı yapın ve BroadcastReceiver tarafından alınan Intent kodunu 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 etiket (kullanılıyorsa) ile NotificationManagerCompat.notify() öğesini ç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 aktarılan bağlamı kullanın.

setRemoteInputHistory() numaralı telefonu arayarak yanıtı bildirimin en altına ekleyin. Ancak, bir mesajlaşma uygulaması oluşturuyorsanız mesajlaşma tarzında bir bildirim oluşturun ve yeni mesajı görüşmeye ekleyin.

Mesajlaşma uygulamalarından gelen bildirimlerle ilgili daha fazla öneri için mesajlaşma uygulamaları için en iyi uygulamalar bölümüne bakın.

İlerleme çubuğu ekleyin

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ı herhangi bir zamanda tahmin edebiliyorsanız setProgress(max, progress, false) çağrısı yaparak göstergenin "belirtilen" biçimini (şekil 5'te gösterildiği gibi) kullanın. İlk parametre, "complete" değerini ifade eder (ör. 100). İkincisi, ne kadar tamamlandığı. Sonuncusu, bunun belirli bir ilerleme çubuğu olduğunu gösterir.

İşleminiz devam ederken progress için güncel bir değerle sürekli olarak setProgress(max, progress, false) çağrısı yapı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 değerine 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) komutunu çağırın. Sonuç olarak, önceki ilerleme çubuğuyla aynı stilde bir gösterge elde edilir. Ancak bu gösterge, projenin tamamlandığını göstermeyen sürekli bir animasyondur. İlerleme animasyonu, siz setProgress(0, 0, false) işlevini çağırana kadar çalışır ve ardından etkinlik göstergesini kaldırmak için bildirimi günceller.

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

Sistem genelinde bir kategori belirleyin

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

Bildiriminiz NotificationCompat içinde tanımlanan bildirim kategorilerinden birine giriyorsa (ör. CATEGORY_ALARM, CATEGORY_REMINDER, CATEGORY_EVENT veya CATEGORY_CALL) uygun kategoriyi setCategory() adresine ileterek bu şekilde beyan edin:

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 ayarlamanız gerekmez. Bunu yalnızca bildirimleriniz NotificationCompat içinde tanımlanan kategorilerden biriyle eşleşiyorsa yapın.

Acil mesaj göster

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

Bildirim çağrıldığında 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 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'i, bildiriminizi tam ekran intent'le nasıl ilişkilendireceğinizi gösterir:

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ı görünürlüğünü ayarlama

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

  • VISIBILITY_PUBLIC: Bildirimin tüm 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 bildirim simgesi ve içerik başlığı gibi temel bilgiler gösterilir. Bildirimin tam içeriği gösterilmez.

VISIBILITY_PRIVATE ayarladığınızda 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.

Bildirimlerinin kilit ekranında görünüp görünmeyeceğini tamamen kullanıcının kontrol edebileceğini ve bunları uygulamanızın bildirim kanallarına göre kontrol edebileceğini unutmayın.

Bildirimi 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() aramasını yaparak bildiriminizin kullanıcının ses, titreşim veya görsel ipuçlarıyla yalnızca bildirim ilk göründüğünde kesintiye uğramasını sağlayabilirsiniz. Bu çağrı daha sonraki güncellemeler için geçerli olmaz.

Bildirimi kaldırma

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

  • Kullanıcı bildirimi kapatır.
  • Bildirimi oluştururken setAutoCancel() adlı kişiyi ararsanız kullanıcı bildirime dokunur.
  • Belirli bir bildirim kimliği için cancel() numaralı telefonu arayabilirsiniz. Bu yöntem ayrıca devam eden bildirimleri de siler.
  • cancelAll() numaralı telefonu ararsınız. Bu durumda, daha önce gönderdiğiniz tüm bildirimler kaldırılır.
  • Bildirimi oluştururken setTimeoutAfter() kullanarak zaman aşımı ayarlarsanız belirtilen süre dolar. Gerekirse belirtilen zaman aşımı süresi dolmadan önce bildirimi 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 uygulamaları dikkate alın.

MessagingStyle'ı kullanma

Android 7.0 (API düzeyi 24) sürümünden itibaren, Android özel olarak mesajlaşma içeriği için bir bildirim stili şablonu sağlar. NotificationCompat.MessagingStyle sınıfını kullanarak ileti dizisi başlığı, ek iletiler ve bildirimin içerik görünümü de dahil olmak üzere bildirimde görüntülenen çeşitli etiketleri değiştirebilirsiniz.

Aşağıdaki kod snippet'i, MessagingStyle sınıfını kullanarak bir bildirimin stilinin nasıl özelleştirileceğini gösterir.

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 uygulamasını kullanırken aşağıdakileri yapın:

  • İkiden fazla kişinin bulunduğu grup sohbetleri için bir başlık belirlemek üzere MessagingStyle.setConversationTitle() numaralı telefonu arayın. İyi bir konuşma başlığı, grup sohbetinin adı veya bir adı yoksa sohbetteki katılımcıların listesi olabilir. Bu olmadan ileti, ileti dizisindeki en son iletiyi gönderen kişiyle bire bir görüşmeye ait olarak algılanabilir.
  • Resimler gibi medya mesajlarını eklemek için MessagingStyle.setData() yöntemini kullanın. Kalıp resminin/* MIME türleri desteklenir.

Doğrudan Yanıtı kullanma

Doğrudan Yanıt, kullanıcının bir iletiyi satır içi olarak yanıtlamasına olanak tanır.

  • Bir kullanıcı satır içi yanıt işlemiyle yanıt verdikten sonra MessagingStyle bildirimini güncellemek için MessagingStyle.addMessage() öğesini kullanın ve bildirimi geri çekmeyin ya da iptal etmeyin. Bildirimi iptal etmezseniz kullanıcı bildirimden birden fazla yanıt gönderebilir.
  • Satır içi yanıt işlemini Wear OS ile uyumlu hale getirmek için Action.WearableExtender.setHintDisplayInlineAction(true) numaralı telefonu arayın.
  • Bildirime geçmiş mesajlar ekleyerek doğrudan yanıt ileti dizisine bağlam sağlamak için addHistoricMessage() yöntemini kullanın.

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

  • Akıllı Yanıt'ı etkinleştirmek için yanıtlama işleminde setAllowGeneratedResponses(true) numaralı telefonu arayın. Bu durum, bildirim bir Wear OS cihaza köprü bağlandığında kullanıcılara Akıllı Yanıt yanıtlarının sunulmasını sağlar. Akıllı Yanıt yanıtları, NotificationCompat.MessagingStyle bildirimi tarafından sağlanan bağlam kullanılarak tamamen saatteki bir makine öğrenimi modeli tarafından oluşturulur ve yanıt oluşturmak için internete hiçbir veri yüklenmez.

Bildirim meta verileri ekleme