Bildirim oluşturma

Bildirimler, uygulamanızdaki etkinlikler hakkında kısa ve zamanında bilgiler sağlarken, aynı zamanda kullanılmıyor. Bu dokümanda, farklı özellikler. Bildirimlerin Android'de nasıl göründüğüne giriş için Bildirimlere genel bakış başlıklı makaleyi inceleyin. Bildirimleri kullanan örnek kod için Kişiler örnek bulabilirsiniz.

Bu sayfadaki kod NotificationCompat AndroidX Kitaplığı'ndan API'ler. Bu API'ler yalnızca kullanılabilen özellikleri eklemenize olanak tanır. Android'in daha yeni sürümlerinde ise Android'e uyumluluk sağlamaya devam eder. 9 (API düzeyi 28). Ancak satır içi yanıt işlemi gibi bazı özellikler önceki sürümlerde işlem yapılamaz.

AndroidX Core Kitaplığı'nı ekleme

Android Studio ile oluşturulan çoğu projede gerekli NotificationCompat kullanmak için bağımlılıklar varsa, modül düzeyinizin build.gradle dosyası şu bağımlılığı içerir:

Eski

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çimi, diğer bir deyişle daraltılmış bir bildirim form: Bir simge, başlık ve az miktarda metin içeriği gösterir. Bu bölümünde, kullanıcının dokunarak başlatabileceği bildirimin nasıl oluşturulacağı gösterilir. en az 14 gün sürer.

Şekil 1. Şununla bir bildirim: bir simge, başlık ve metin.

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

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

Android 13 (API düzeyi 33) ve sonraki sürümler, yayınlama için çalışma zamanı iznini destekler muaf olmayan [Ön plan hizmetleri (FGS) bildirimleri dahil]

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

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

Çalışma zamanı izinleri hakkında daha fazla bilgi için şuraya bakın: Bildirim çalışma zamanı izni.

Bildirim içeriğini ayarlama

Başlamak için bildirimin içeriğini ve kanalını NotificationCompat.Builder nesnesini tanımlayın. Aşağıdaki örnekte takip etmek için:

  • Küçük bir simge, setSmallIcon(). Kullanıcıların görebileceği, gerekli olan tek içerik budur.

  • Başlık, setContentTitle().

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

  • Bildirim önceliği: setPriority(). Öncelik, bildirimin Android 7.1 ve 7.1'de ne kadar rahatsız edici olduğunu belirler anlatacağım. Android 8.0 ve sonraki sürümlerde kanal önemini şu şekilde ayarlayın: görebilirsiniz.

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 sağlamanızı gerektiriyor Kimlik. Bu, Android 8.0 (API düzeyi 26) ve 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. Siz , genişletilebilir bir bildirim oluşturarak ek bilgiler gösterebilir.

Şekil 2. Genişletilebilir bildirimi daraltılmış ve genişletilmiş biçimlerinde sunar.

Bildiriminizin daha uzun olmasını isterseniz genişletilebilir bildirimi içeren bir stil şablonu setStyle(). Ö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);

Diğer büyük bildirim stilleri hakkında daha fazla bilgi edinmek için medya oynatma kontrolleri için Genişletilebilir bir reklam oluşturma bildirimi gönderebilir.

Kanal oluşturun ve önem verdiğinizi belirleyin

Bildirimi Android 8.0 ve sonraki sürümlerde teslim etmeden önce uygulamanın bildirim kanalına bir örneği ileterek sisteme NotificationChannel - createNotificationChannel(). Aşağıdaki kod SDK_INT sürümü:

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);
    }
}

Çünkü herhangi bir içeriği yayınlamadan önce bildirim kanalını oluşturmanız Android 8.0 ve sonraki sürümlerde bildirimler almak istiyorsanız, uygulamanız olur olmaz bu kodu yürütün başlar. Bunu tekrar tekrar çağırmak güvenlidir çünkü mevcut bir bildirim kanalı hiçbir işlem yapmaz.

NotificationChannel oluşturucusu, şunlardan birini kullanan bir importance gerektirir: sabit değerleri NotificationManager sınıfı. Bu parametresi, kullanıcıya ait olan herhangi bir bildirim için kullanıcının . Android 7.1'i desteklemek için önceliği setPriority() olarak ayarlayın. ve önceki örnekte gösterildiği gibi.

Bildirim önem derecesini veya önceliğini şurada gösterildiği gibi ayarlamanız gerekir: aşağıdaki örneğe göre sistem, alacağınız uyarının davranışını garanti etmez. İçinde bazı durumlarda sistem, önem düzeyini başka faktörlere bağlı olarak değiştirebilir. ve kullanıcı her zaman belirli bir konu için önem düzeyinin yardımcı olur.

Farklı düzeylerin ne anlama geldiği hakkında daha fazla bilgi edinmek için bildirim önem derecesi seviyeleri hakkında daha fazla bilgi edinin.

Bildirimin dokunma işlemini ayarlama

Her bildirim, genellikle cihazınızdaki bir etkinliği açmak için bir dokunmaya yanıt vermelidir. uygulamada görünmesini sağlayabilirsiniz. Bunun için içerik amacı belirtin PendingIntent ile tanımlanır ve bunu setContentIntent().

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

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() Kullanıcı bildirime dokunduğunda bildirim otomatik olarak kaldırılır.

setFlags() yöntemi önceki örnekte gösterildiği gibi kullanıcının beklenen gezinme menüsü korunur. bildirimi kullanarak uygulamanızı açtıktan sonra daha fazla deneyim Birlikte çalıştığınız başladığınız etkinliğin türüne bağlı olarak kullanabilirsiniz. şu:

  • Özel olarak bildirime verilen yanıtlar için mevcut olan bir etkinlik. Normal uygulama kullanımı sırasında kullanıcının bu etkinliğe gitmesinin bir nedeni yoktur. Bu nedenle etkinlik, uygulamanızın ana makinesine eklenmek yerine yeni bir görev başlatır. mevcut görev ve kullanın. Bu, önceki örnekte oluşturulan niyet türüdür.

  • Uygulamanızın normal uygulama akışında bulunan etkinlik. Böyle durumlarda kullanıcının beklentilerinin karşılanmaması için etkinlik başlangıcında bir arka yığın oluşturulur. Geri ve Yukarı düğmeleri için korunuyor.

Bildiriminizin amacını yapılandırmanın farklı yolları hakkında daha fazla bilgi için bkz. Bildirimden Etkinlik Başlatma.

Bildirimi göster

Bildirimin gösterilmesi için şu numarayı arayın: NotificationManagerCompat.notify() bildirim için benzersiz bir kimlik iletmek ve NotificationCompat.Builder.build(). 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, çünkü bu özelliği güncellemek veya kaldırmak istediğinizde bildirimi edinin.

Ayrıca, Android 13 ve sonraki sürümleri kullanıyorsanız bildirimleri manuel olarak etkinleştirin veya bildirim isteyin.

İşlem düğmeleri ekleyin

Bir bildirimde, kullanıcının yanıt vermesine olanak tanıyan en fazla üç işlem düğmesi sunulabilir. hızlı bir şekilde yapabilirsiniz. Örneğin, bir hatırlatıcıyı erteleyebilir veya bir kısa mesajı yanıtlayabilirsiniz. Ancak bunlar İşlem düğmeleri, kullanıcı ekrana dokunduğunda gerçekleştirilen işlemi bildirimi gönderebilir.

Şekil 3. Şununla bir bildirim: tek bir işlem düğmesi.

İşlem düğmesi eklemek için bir PendingIntent addAction() yöntemidir. Bu işlem, bildirimin varsayılan dokunma işlemini ayarlamaya benzer bir etkinlik başlatmak yerine, etkinlik başlatma, BroadcastReceiver İşlemin uygulamayı kesintiye uğratmaması için arka planda bir iş gerçekleştirir. zaten açık.

Örneğin, aşağıdaki kodda bir yayının belirli bir alıcı:

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)</span>
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);</span>

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

Arka planda çalışacak bir BroadcastReceiver oluşturma hakkında daha fazla bilgi için için Yayınlara genel bakış bölümünü inceleyin.

Bunun yerine medya oynatma düğmeleriyle bir bildirim oluşturmaya çalışıyorsanız parçaları nasıl duraklatacağınızı ve atlayacağınızı öğrenmek için medya kontrol eder.

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 metni doğrudan bildirime girebilir. Ardından metin, ancak Google Play'de kullanılabilir. Örneğin, doğrudan yanıt işlemi kullanıcıların kısa mesajları yanıtlamasına veya bildirimi görürsünüz.

4.Şekil "Yanıtla"ya dokunma düğmesi metin girişini açar.

Doğrudan yanıtlama işlemi, bir metin girişi açar. Kullanıcı yazmayı bitirdiğinde sistem, metni ekler yanıt olarak belirlediğiniz kavrama yanıt verir ve düşünmeye başlayın.

Yanıtla düğmesini ekleme

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

  1. Şunun bir örneğini oluştur: RemoteInput.Builder. bildirim işleminize ekleyebilirsiniz. Bu sınıfın oluşturucusu kabul ediyor sistemin metin girişi için anahtar olarak kullandığı bir dize. 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. Etikete RemoteInput. kullanarak bir eyleme addRemoteInput().

    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);
      

Kullanıcı bildirim işlemine ilişkin bir bildirim içerir.

Yanıttan kullanıcı girişini alma

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

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;
 }

Kısa mesajı işledikten sonra şu numarayı arayarak bildirimi güncelleyin: aynı kimlik ve etikete (kullanılıyorsa) NotificationManagerCompat.notify(). Bu Doğrudan yanıt arayüzünü gizlemek ve kullanıcıya yanıtının doğru bir şekilde alınır ve işlenir.

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öntemidir.

Şu numarayı arayarak yanıtı bildirimin altına ekleyin: setRemoteInputHistory(). Ancak bir mesajlaşma uygulaması geliştiriyorsanız mesajlaşma tarzında bildirimi ve mesaj dizisine yeni bir mesaj gönderebilirsiniz.

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

İlerleme çubuğu ekleyin

Bildirimler, kullanıcılara devam eden bir işlemin durumu

5. Şekil. sırasındaki ilerleme çubuğu bir işlemdir.

İşlemin ne kadarının tamamlandığını herhangi bir zamanda tahmin edebiliyorsanız "belirle" (Şekil 5'te gösterildiği gibi) çağrısı yaparak setProgress(max, progress, false). İlk parametre, "complete" değeri 100 gibi olur. İkincisi, ne kadarının tamamlandığını gösterir. Sonuncusu, bunun kesin bir ilerleme olduğunu çubuk.

İşleminiz devam ederken progress için güncel bir değerle setProgress(max, progress, false) hizmetini sürekli olarak çağırın ve bildirimi şu şekilde yeniden gönderin: aşağıdaki örnekte gösterilmiştir.

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. İsterseniz işlemin tamamlandığını gösteren bir ilerleme çubuğu görürsünüz. Her iki durumda da, bildirim metnini işlemin tamamlandığını belirtecek şekilde güncelleyin. Kaldırmak için ilerleme çubuğunda setProgress(0, 0, false) numarasını arayın.

Belirsiz bir ilerleme çubuğunun (tamamlandığını belirten bir çubuk) görüntülenmesi yüzdesi) için setProgress(0, 0, true) numaralı telefonu arayın. Sonuç olarak, önceki ilerleme çubuğuyla aynı stile sahiptir ancak sürekli animasyonun bittiği anlamına gelmez. İlerleme animasyonu, setProgress(0, 0, false) adlı kişiyi arar ve ardından bildirimi kaldırarak etkinlik göstergesine dokunun.

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

Sistem genelinde bir kategori belirleyin

Android, rahatsız edici bir durum olup olmadığını belirlemek için sistem genelinde önceden tanımlanmış kategoriler kullanır Kullanıcı Rahatsız Etmeyin özelliğini etkinleştirdiğinde belirli bir bildirimi olan kullanıcı mod'u seçin.

Bildiriminiz, şurada tanımlanan bildirim kategorilerinden birine giriyorsa: NotificationCompat - örneğin CATEGORY_ALARM, CATEGORY_REMINDER, CATEGORY_EVENT veya CATEGORY_CALL: beyan etmek uygun kategoriyi setCategory():

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, bildirim kategorinizle ilgili bu bilgileri Cihaz, Do Not modundayken bildiriminizi görüntülemeyle ilgili kararlar Rahatsız edici. Ancak, sistem genelinde bir kategori ayarlamanız gerekmez. Yalnızca bunu yap Bildirimleriniz şurada tanımlanan kategorilerden biriyle eşleşiyorsa: NotificationCompat

Acil mesaj göster

Uygulamanızın, gelen telefon araması veya çalan alarm. Böyle durumlarda, bir tam ekran intent'i tıklayın.

Bildirim çağrıldığında, kullanıcılar aşağıdakilerden birini görür: cihazın kilit durumu:

  • Kullanıcının cihazı kilitliyse, görüntülenen tam ekran etkinlik kilit ekranı.
  • Kullanıcının cihazının kilidi açıksa bildirim genişletilmiş bir bildirimi işleme veya kapatma seçeneklerini içeren bir form oluşturabilirsiniz.
ziyaret edin.

Aşağıdaki kod snippet'i, bildiriminizi tam ekran intent:

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ındaki bildirimde gösterilen ayrıntı düzeyini kontrol etmek için: telefon etmek setVisibility() 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: bildirim simgesi ve içerik gibi temel bilgiler kilit ekranında görünür. Bildirimin tam içeriği seçin.

VISIBILITY_PRIVATE ayarlarını yaparken, uygulamanızın alternatif bir sürümünü de sağlayabilirsiniz. bildirim içeriğini devre dışı bırakabilirsiniz. Örneğin, SMS uygulaması "3 yeni kısa mesajınız var" şeklinde bir bildirim görüntüleyebilir. ama , ileti içeriklerini ve gönderenleri gizler. Bu alternatifi sunmak için bildirimi almak için önce NotificationCompat.Builder, her zamanki gibi. Ardından, alternatif bildirimi ekleyin normal bildirime setPublicVersion().

Şunu da unutmayın: Bildirimler kilit ekranında görünür ve cihazınıza bağlı olarak uygulamanın bildirim kanallarına erişebilirsiniz.

Bildirimi güncelleme

Bir bildirimi gönderdikten sonra güncellemek için şu numarayı arayın: NotificationManagerCompat.notify() (kullandığınız kimliği tekrar ileterek) kontrol edin. Önceki bildirim kapatılırsa yeni bir bildirim oluşturulur .

İsterseniz setOnlyAlertOnce() Böylece bildiriminiz sesli, titreşimli veya görsel olarak kullanıcının çalışmasını kesintiye uğratır ipuçları (yalnızca bildirim ilk kez göründüğünde, daha sonrası için değil) güncellemelerine göz atın.

Bildirimi kaldırma

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

  • Kullanıcı bildirimi kapatır.
  • setAutoCancel() adlı kişiyi ararsanız kullanıcı bildirime dokunur. bildirimi oluşturabilirsiniz.
  • Aranacağınız zaman: cancel() adresini ziyaret edin. Bu yöntem ayrıca, bildirimleri etkinleştirebilirsiniz.
  • Aranacağınız zaman: cancelAll() Bu işlem, daha önce gönderdiğiniz tüm bildirimleri kaldırır.
  • bildirimi, setTimeoutAfter(). Gerekirse belirtilen zaman aşımından önce bildirimi iptal edebilirsiniz kadar geçen süreyi belirtir.

Mesajlaşma uygulamaları için en iyi uygulamalar

Şu hesap için bildirim oluştururken burada listelenen en iyi uygulamaları dikkate alın: Mesajlaşma ve sohbet uygulamaları.

MessagingStyle'ı kullanma

Android, Android 7.0 (API düzeyi 24) sürümünden itibaren bir bildirim stili sağlar. şablonunuzu kullanabilirsiniz. Her bir NotificationCompat.MessagingStyle bildirim üzerinde görüntülenen etiketlerden birkaçını değiştirebilirsiniz. ve ileti dizisine ait içerik görünümünü içeren ek mesajlar bildirim.

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

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, elde etmek için Person sınıfı en uygun şekilde oluşturulmasını sağlar.

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

  • Telefonla arama MessagingStyle.setConversationTitle() seçeneğini kullanabilirsiniz. İyi sohbet başlığı grup sohbetinin adı olabilir veya ve sohbetteki katılımcıların listesini görebilirsiniz. Bu olmadan, ile bire bir görüşmeye ait olduğu düşünülebilir. ileti dizisindeki en son iletinin göndereni.
  • Şunu kullanın: MessagingStyle.setData() yöntemini kullanabilirsiniz. Kalıbın MIME türleri resim/* 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.addMessage() MessagingStyle bildirimini güncelleyin ve bildirimi geri çekmeyin veya iptal etmeyin bildirimi görürsünüz. Bildirimin iptal edilmemesi, kullanıcının birden fazla bildirim göndermesine olanak tanır. bildirimden yanıt alır.
  • Satır içi yanıt işlemini Wear OS ile uyumlu hale getirmek için şu numarayı arayın: Action.WearableExtender.setHintDisplayInlineAction(true).
  • Şunu kullanın: addHistoricMessage() tarihsel veriler ekleyerek doğrudan cevap görüşmesi için bağlam bilgisi sağlama yöntemi bildirime iletebilir.

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

  • Akıllı Yanıt'ı etkinleştirmek için şu numarayı arayın: setAllowGeneratedResponses(true) karar vermemiz gerekir. Bu durumda Akıllı Yanıt yanıtları, Kullanıcı, bildirim bir Wear OS cihaza köprü olarak bağlandığında kullanılabilir. Akıllı Yanıt yanıtlar, tamamen kol saatindeki bir makine öğrenimi modeli tarafından NotificationCompat.MessagingStyle tarafından sağlanan bağlam oluşturmak için herhangi bir veri yüklenmez ve tıklayın.

Bildirim meta verileri ekleme