Bildirim oluşturma

Bildirimler, uygulamanız kullanılmadığında uygulamanızdaki etkinliklerle ilgili kısa ve zamanında bilgi sağlar. 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:

  • 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.

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

  • Bildirim önceliği: setPriority(). Öncelik, Android 7.1 ve önceki sürümlerde bildirimin ne kadar müdahaleci olduğunu belirler. Android 8.0 ve sonraki sürümlerde kanal ö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. Daraltılmış ve genişletilmiş halleriyle genişletilebilir bildirim.

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şturma ve kanalın önemini belirleme

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

Çü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. Mevcut bir bildirim kanalı oluşturmak herhangi bir işlem gerçekleştirmediğinden bu işlevi tekrar tekrar çağırabilirsiniz.

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 önemini veya önceliğini aşağıdaki örnekte gösterildiği gibi ayarlamanız gerekir ancak sistem, alacağınız uyarı davranışını garanti etmez. İç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. Kullanıcının normal uygulama kullanımı sırasında bu etkinliğe gitmesi için bir neden yoktur. Bu nedenle etkinlik, uygulamanızın mevcut görev ve arka gruplarına eklenmek yerine yeni bir görev başlatır. Bu, önceki örnekte oluşturulan niyet türüdür.

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

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

Bildirimi gösterme

Bildirimin gösterilmesi için şu numarayı arayın: NotificationManagerCompat.notify() bildirim için benzersiz bir kimlik iletmek ve NotificationCompat.Builder.build(). Bu durum aşağıdaki örnekte gösterilmektedir:

Kotlin

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

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

Java

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

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

NotificationManagerCompat.notify() 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)
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent)

Java


String ACTION_SNOOZE = "snooze"

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

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

Arka planda çalış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 (API düzeyi 24) sürümünde kullanıma sunulan doğrudan yanıt işlemi, kullanıcıların doğrudan bildirime metin girmelerine olanak tanır. Ardından, kısa mesaj bir etkinlik açılmadan uygulamanıza gönderilir. Örneğin, 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şin 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. RemoteInput nesnesini addRemoteInput() kullanarak bir işleme ekleyin.

    Kotlin

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

    Java

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

    Kotlin

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

    Java

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

Sistem, kullanıcının bildirim işlemini tetiklediğinde (Şekil 4'te gösterildiği gibi) kullanıcıdan 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 ş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 bir bildirim oluşturun ve yeni mesajı görüşmeye ekleyin.

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

Kotlin

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

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

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

Java

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

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

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

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

İşlemin sonunda progress, max 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ğu (tamamlanma yüzdesini göstermeyen bir çubuk) görüntülemek için setProgress(0, 0, true) işlevini çağırın. Sonuç olarak, önceki ilerleme çubuğuyla aynı stile sahiptir ancak sürekli animasyonun tamamlanmadığı anlamına gelir. İ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.

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

Kotlin

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

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

Java

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

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

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

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

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

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

  • VISIBILITY_PRIVATE: bildirim simgesi ve içerik gibi temel bilgiler kilit ekranında görünür. Bildirimin tam içeriği gösterilmiyor.

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 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 bir bildirimi, belirtilen zaman aşımı süresi dolmadan iptal edebilirsiniz.

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 7.0 (API düzeyi 24) sürümünden itibaren Android, mesajlaşma içeriği için özel olarak bir bildirim stili şablonu sağlar. 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.
  • Resim gibi medya mesajları eklemek için MessagingStyle.setData() yöntemini kullanın. 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