Bildirim oluşturma

Bildirimler, uygulamanızın kullanılmadığı zamanlarda yer alan etkinlikler hakkında kısa ve zamanında bilgiler sağlar. Bu dokümanda, çeşitli özelliklerle nasıl bildirim oluşturulacağı gösterilmektedir. Android'de bildirimlerin nasıl göründüğüne dair tanıtım için Bildirimlere genel bakış konusuna göz atın. 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 kullanmaktadır. Bu API'ler, yalnızca Android'in yeni sürümlerinde kullanılabilen özellikleri eklerken Android 9 (API düzeyi 28) ile uyumluluk sağlamaya devam etmenizi sağlar. Ancak satır içi yanıt işlemi gibi bazı özellikler, önceki sürümlerde işlem yapılmamasına neden olur.

AndroidX Core Library'yi ekleyin

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

Modern

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 en kompakt biçimindeki bildirimler (daraltılmış form olarak da bilinir) bir simge, 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 etkinliği başlatmak için dokunabileceği bildirimin nasıl oluşturulacağı gösterilmektedir.

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

Bir bildirimin her bir bölümüyle ilgili daha fazla ayrıntı için bildirim anatomisi konusunu okuyun.

Çalışma zamanı iznini bildirme

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

Uygulamanızın manifest dosyasında beyan etmeniz gereken izin, aşağıdaki 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 bir NotificationCompat.Builder nesnesi kullanarak bildirimin içeriğini ve kanalını ayarlayın. Aşağıdaki örnekte, şunlarla bildirimin nasıl oluşturulacağı gösterilmektedir:

  • setSmallIcon() tarafından ayarlanmış küçük bir simge. Bu, gerekli olan tek kullanıcı tarafından görülebilen içeriktir.

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

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

  • setPriority() tarafından ayarlanan bildirim önceliği. Öncelik, bildirimin Android 7.1 ve önceki sürümlerde ne kadar rahatsız edici olduğunu belirler. Android 8.0 ve sonraki sürümler için bunun yerine, bir sonraki bölümde gösterildiği gibi kanal önem derecesini 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şturucu, bir kanal kimliği sağlamanızı gerektirir. Bu, Android 8.0 (API düzeyi 26) ve sonraki sürümlerle uyumluluk için gerekli olsa da ö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 bir bildirim oluşturarak ek bilgiler gösterebilirsiniz.

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

Bildiriminizin daha uzun olmasını istiyorsanız setStyle() ile bir stil şablonu ekleyerek genişletilebilir bildirimi 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 de dahil olmak üzere diğer büyük bildirim stilleri hakkında daha fazla bilgi için Genişletilebilir bildirim oluşturma bölümüne bakın.

Kanal oluşturma ve önem düzeyini ayarlama

Android 8.0 ve sonraki sürümlerde bildirimi iletmeden önce, bir NotificationChannel örneğini createNotificationChannel() cihazına ileterek uygulamanızın bildirim kanalını sisteme kaydedin. Aşağıdaki kod, SDK_INT sürümündeki bir koşul tarafından engelleniyor:

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 herhangi bir bildirim yayınlamadan önce bildirim kanalını oluşturmanız gerektiğinden, bu kodu uygulamanız başlar başlamaz yürütün. Mevcut bir bildirim kanalı oluşturulması hiçbir işlem yapmadığından bunu 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 bildirimlerde kullanıcının çalışmasını nasıl kesintiye uğratacağını belirler. Önceki örnekte gösterildiği gibi önceliği, setPriority() ile Android 7.1 ve önceki sürümleri destekleyecek şekilde ayarlayın.

Bildirim önemini veya önceliğini aşağıdaki örnekte gösterildiği gibi ayarlamanız gerekse de sistem, alacağınız uyarı davranışını garanti etmez. Bazı durumlarda, sistem, önem düzeyini diğer faktörlere bağlı olarak değiştirebilir ve kullanıcı, belirli bir kanalın önem düzeyini dilediği zaman yeniden tanımlayabilir.

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

Bildirimin dokunma işlemini ayarlama

Her bildirimin bir dokunuşa yanıt vermesi gerekir. Bu, genellikle uygulamanızda bildirime karşılık gelen bir etkinliğin açılmasıdır. Bunu yapmak için PendingIntent nesnesiyle tanımlanmış bir içerik amacı belirtin ve bunu setContentIntent()'e iletin.

Aşağıdaki snippet'te, kullanıcı bildirime dokunduğunda bir etkinliği 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, kullanıcı dokunduğunda bildirimi otomatik olarak kaldıran setAutoCancel() işlevini çağırır.

Yukarıdaki örnekte gösterilen setFlags() yöntemi, kullanıcı bildirimi kullanarak uygulamanızı açtıktan sonra kullanıcının beklenen gezinme deneyimini korur. Bu aracı, başladığınız aktivitenin türüne bağlı olarak kullanabilirsiniz. Bunlardan biri olabilir:

  • Yalnızca bildirime verilen yanıtlar için mevcut 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 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 bir etkinlik. Bu durumda, etkinlik başlatıldığında kullanıcının Geri ve Yukarı düğmelerine ilişkin beklentilerinin korunması için bir arka yığın oluşturulur.

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() yöntemini çağırarak bildirim ve NotificationCompat.Builder.build() sonucu için benzersiz bir kimlik iletin. Bu, aşağıdaki örnekte gösterilmiştir:

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 bildirimi 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 bulunabileceğiniz bir iletişim kutusu oluşturun.

İşlem düğmesi ekleme

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

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

İşlem düğmesi eklemek için addAction() yöntemine PendingIntent iletin. Bu, bildirimin varsayılan dokunma işlemini ayarlamak gibidir. Tek fark, bir etkinliği başlatmak yerine arka planda iş gerçekleştiren bir BroadcastReceiver başlatmak gibi başka şeyler de yapmaktır. Böylece işlemin, açık durumdaki uygulamayı kesintiye uğratmaması sağlanır.

Örneğin, aşağıdaki kod bir yayının belirli bir alıcıya nasıl gönderileceğini gösterir:

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 için bir BroadcastReceiver oluşturma hakkında daha fazla bilgi için Yayınlara genel bakış konusuna bakın.

Bunun yerine, parçaları duraklatmak ve atlamak gibi medya oynatma düğmeleriyle bildirim oluşturmaya çalışıyorsanız medya kontrolleriyle 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ı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 kısa mesajları yanıtlamasına veya bildirimin içinden görev listelerini güncellemesine izin vermek için doğrudan yanıtlama işlemi kullanabilirsiniz.

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

Doğrudan yanıt işlemi, bildirimde bir metin girişi açan ek düğme olarak görünür. Kullanıcı yazmayı bitirdiğinde, sistem, bildirim işlemi için belirttiğiniz amaca metin yanıtını ekler ve niyeti uygulamanıza gönderir.

Yanıtla düğmesini ekleyin

Doğrudan yanıt özelliğini 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 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ı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ı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);
      

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

Yanıttan kullanıcı girişini al

Bildirimin yanıt kullanıcı arayüzünden kullanıcı girişini almak için BroadcastReceiver tarafından alınan Intent bilgisini ileterek RemoteInput.getResultsFromIntent() çağrısı yapın:

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, kullanılıyorsa aynı kimlik ve etiketle NotificationManagerCompat.notify() yöntemini çağırarak bildirimi güncelleyin. Bu, doğrudan yanıt kullanıcı arayüzünü gizlemek ve kullanıcıya yanıtının doğru şekilde alındığını ve 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 alt kısmı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ına yönelik 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 ilerleme çubuğu.

İşlemin ne kadarının tamamlandığını herhangi bir zamanda tahmin edebiliyorsanız, setProgress(max, progress, false) yöntemini çağırarak göstergenin "belirgin" biçimini (Şekil 5'te gösterildiği gibi) kullanın. Birinci parametre "complete" değeridir (ör. 100). İkincisi, ne kadar tamamlandığıdır. Sonuncusu, bunun belirli bir ilerleme çubuğu olduğunu belirtir.

İşleminiz devam ederken, progress için güncellenmiş bir değerle setProgress(max, progress, false) numaralı telefonu 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 değerine eşit olmalıdır. İşlemin tamamlandığını göstermek için ilerleme çubuğundan ayrılabilir veya işlemi 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) yöntemini çağırın. Sonuç, önceki ilerleme çubuğuyla aynı stile sahip bir göstergedir ancak bu, tamamlandığını belirtmeyen sürekli bir animasyondur. İlerleme animasyonu, siz setProgress(0, 0, false) çağrısı yapana kadar çalışır ve daha sonra, etkinlik göstergesini kaldırmak için bildirimi günceller.

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

Sistem genelinde bir kategori ayarlayın

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

Bildiriminiz NotificationCompat içinde tanımlanan CATEGORY_ALARM, CATEGORY_REMINDER, CATEGORY_EVENT veya CATEGORY_CALL gibi bildirim kategorilerinden birine giriyorsa uygun kategoriyi setCategory() tarafına ileterek bu durumu bildirin:

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 bildiriminizin görüntülenmesi konusunda 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 bir telefon araması veya çalan bir alarm gibi acil, 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ı kilitlenirse kilit ekranını kapsayan tam ekran bir etkinlik görünür.
  • Kullanıcının cihazının kilidi açıksa bildirim, işleme veya bildirim kapatma seçeneklerini içeren genişletilmiş bir biçimde görünür.

Aşağıdaki kod snippet'i, bildiriminizi tam ekran intent ile 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() numaralı telefonu arayı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 bildirimin simgesi ve içerik başlığı gibi temel bilgiler gösterilir. Bildirimin tüm içeriği gösterilmez.

VISIBILITY_PRIVATE ayarını yaptığı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ı "3 yeni kısa mesajınız var" ifadesini gösteren ancak mesajın içeriğini ve gönderenleri gizleyen bir bildirim görüntüleyebilir. Bu alternatif bildirimi sağlamak için önce her zamanki gibi NotificationCompat.Builder ile alternatif bildirimi oluşturun. Ardından, setPublicVersion() ile normal bildirime alternatif bildirimi ekleyin.

Bildirimlerinin kilit ekranında görünüp görünmeyeceğinin her zaman nihai kontrolünde olduğunu ve uygulamanızın bildirim kanallarına göre bunları kontrol edebileceğini unutmayın.

Bildirim güncelleme

Bir bildirimi yayınladıktan sonra güncellemek için, daha önce kullandığınız kimliği ileterek NotificationManagerCompat.notify() öğesini tekrar arayın. Önceki bildirim kapatılırsa bunun yerine yeni bir bildirim oluşturulur.

İsteğe bağlı olarak setOnlyAlertOnce() işlevini çağırarak bildiriminiz, sesli, titreşimli veya görsel ipuçlarıyla kullanıcının dikkatini yalnızca ilk kez göründüğünde kesintiye uğratması için sonraki güncellemeler için bunu aramaz.

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() öğesini ararsanız kullanıcı bildirime dokunur.
  • Belirli bir bildirim kimliği için cancel() yöntemini çağırırsınız. Bu yöntem devam eden bildirimleri de siler.
  • Daha önce gönderdiğiniz tüm bildirimleri kaldıran cancelAll() numarasını çağırıyorsunuz.
  • Bildirimi oluştururken setTimeoutAfter() aracını kullanarak bir zaman aşımı ayarlarsanız belirtilen süre biter. Gerekirse belirtilen zaman aşımı süresi dolmadan bir 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ı göz önünde bulundurun.

MessagingStyle'ı kullan

Android 7.0'dan (API düzeyi 24) başlayarak Android, özellikle 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ü gibi, 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östermektedir.

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 başlayarak, bildirimin ve avatarlarının en iyi şekilde oluşturulmasını sağlamak 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 katıldığı grup sohbetleri için bir başlık belirlemek üzere MessagingStyle.setConversationTitle() numaralı telefonu arayın. Grup sohbetinin adı veya adı yoksa görüşmedeki katılımcıların listesi iyi bir görüşme başlığı olabilir. Aksi takdirde, mesaj, görüşmedeki en son mesajı gönderen kişiyle yapılan bire bir görüşmenin ait olduğu düşünülebilir.
  • Resim gibi medya mesajlarını eklemek için MessagingStyle.setData() yöntemini kullanın. Resim/* kalıbının MIME türleri desteklenir.

Doğrudan Yanıt özelliğini kullan

Doğrudan Yanıt, kullanıcının bir iletiye satır içi yanıt göndermesine 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() seçeneğini kullanın ve bildirimi geri çekmeyin veya iptal etmeyin. Bildirimin iptal edilmemesi, kullanıcının bildirimden birden fazla yanıt göndermesine olanak tanır.
  • 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 eski mesajlar ekleyerek doğrudan yanıt odaklı bir görüşmeyle ilgili bağlam sağlamak için addHistoricMessage() yöntemini kullanın.

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

  • Akıllı Yanıt özelliğini etkinleştirmek için yanıtlama işleminde setAllowGeneratedResponses(true) numarasını arayın. Bu sayede, bildirim Wear OS cihaza köprülendiğinde kullanıcılar Akıllı Yanıt yanıtlarını görebilir. Akıllı Yanıt yanıtları, NotificationCompat.MessagingStyle bildirimiyle sağlanan bağlam kullanılarak tamamen saat üzerinde çalışan bir makine öğrenimi modeli tarafından oluşturulur ve yanıtları oluşturmak için internete herhangi bir veri yüklenmez.

Bildirim meta verileri ekleme