Bildirimler, uygulamanız kullanılmadığında uygulamanızdaki etkinliklerle ilgili kısa ve zamanında bilgi sağlar. Bu dokümanda, çeşitli özelliklere sahip bir bildirimin nasıl oluşturulacağı gösterilmektedir. Bildirimlerin Android'de nasıl göründüğüne dair bir giriş için Bildirimlere genel bakış başlıklı makaleyi inceleyin. Bildirimleri kullanan örnek kod için GitHub'daki Kişiler örneğine göz atın.
Bu sayfadaki kod, AndroidX Kitaplığı'ndaki NotificationCompat
API'lerini kullanır. Bu API'ler, Android 9'a (API düzeyi 28) kadar geriye dönük uyumluluk sağlarken yalnızca Android'in daha yeni sürümlerinde kullanılabilen özellikleri eklemenize olanak tanır. Ancak satır içi yanıtlama işlemi gibi bazı özellikler, önceki sürümlerde işlem yapmaz.
AndroidX Core Library'i ekleme
Android Studio ile oluşturulan çoğu proje, NotificationCompat
'ü kullanmak için gerekli bağımlılıkları içerir. Bununla birlikte, modül düzeyindeki build.gradle
dosyanızın aşağıdaki bağımlılığı içerdiğini doğrulayın:
Groovy
dependencies { implementation "androidx.core:core:2.2.0" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:2.2.0") }
Temel bildirim oluşturma
En temel ve kompakt biçimindeki (daraltılmış biçim olarak da bilinir) bildirimler bir simge, başlık ve az miktarda metin içeriği gösterir. Bu bölümde, kullanıcının uygulamanızda bir etkinlik başlatmak için dokunabileceği bir bildirimin nasıl oluşturulacağı gösterilmektedir.
Bildirilerin her bir bölümü hakkında daha fazla bilgi için bildirim anatomisi başlıklı makaleyi inceleyin.
Çalışma zamanı iznini beyan etme
Android 13 (API düzeyi 33) ve sonraki sürümler, bir uygulamadan muaf tutulmayan (Ön Plan Hizmetleri (FGS) dahil) bildirimlerin yayınlanması için çalışma zamanı iznini destekler.
Uygulamanızın manifest dosyasında beyan etmeniz gereken izin aşağıdaki kod snippet'inde gösterilmektedir:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
Çalışma zamanı izinleri hakkında daha fazla bilgi için Bildirim çalışma zamanı izni bölümüne bakın.
Bildirim içeriğini ayarlama
Başlamak için bir NotificationCompat.Builder
nesnesi kullanarak bildirimin içeriğini ve kanalını ayarlayın. Aşağıdaki örnekte, aşağıdakileri içeren bir bildirimin nasıl oluşturulacağı gösterilmektedir:
setSmallIcon()
tarafından ayarlanan küçük bir simge. Kullanıcıların görebileceği tek zorunlu içerik budur.setContentTitle()
tarafından ayarlanan bir başlık.setContentText()
tarafından ayarlanan gövde metni.setPriority()
tarafından ayarlanan bildirim önceliği. Öncelik, Android 7.1 ve önceki sürümlerde bildirimin ne kadar müdahaleci olduğunu belirler. Android 8.0 ve sonraki sürümlerde, bunun yerine kanal önemini bir sonraki bölümde gösterildiği gibi ayarlayın.
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationCompat.Builder
kurucusu, bir kanal kimliği sağlamanız gerekir. Bu, Android 8.0 (API düzeyi 26) ve sonraki sürümlerle uyumluluk için gereklidir ancak önceki sürümler tarafından yoksayılır.
Varsayılan olarak, bildirimin metin içeriği bir satıra sığacak şekilde kesilir. Genişletilebilir bildirim oluşturarak ek bilgiler gösterebilirsiniz.
Bildiriminizin daha uzun olmasını isterseniz setStyle()
içeren bir stil şablonu ekleyerek genişletilebilir bir bildirim etkinleştirebilirsiniz.
Örneğin, aşağıdaki kod daha büyük bir metin alanı oluşturur:
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Much longer text that cannot fit one line...") .setStyle(NotificationCompat.BigTextStyle() .bigText("Much longer text that cannot fit one line...")) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Much longer text that cannot fit one line...") .setStyle(new NotificationCompat.BigTextStyle() .bigText("Much longer text that cannot fit one line...")) .setPriority(NotificationCompat.PRIORITY_DEFAULT);
Resim ve medya oynatma kontrolleri ekleme gibi diğer büyük bildirim stilleri hakkında daha fazla bilgi edinmek için Genişletilebilir bildirim oluşturma bölümüne bakın.
Kanal oluşturma ve önemini ayarlama
Bildirimi Android 8.0 ve sonraki sürümlerde teslim etmeden önce bir NotificationChannel
örneğini createNotificationChannel()
'e ileterek uygulamanızın bildirim kanalını sisteme kaydedin.
Aşağıdaki kod, SDK_INT
sürümündeki bir koşul tarafından engellenir:
Kotlin
private fun createNotificationChannel() { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is not in the Support Library. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val name = getString(R.string.channel_name) val descriptionText = getString(R.string.channel_description) val importance = NotificationManager.IMPORTANCE_DEFAULT val channel = NotificationChannel(CHANNEL_ID, name, importance).apply { description = descriptionText } // Register the channel with the system. val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) } }
Java
private void createNotificationChannel() { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is not in the Support Library. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence name = getString(R.string.channel_name); String description = getString(R.string.channel_description); int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); channel.setDescription(description); // Register the channel with the system; you can't change the importance // or other notification behaviors after this. NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } }
Android 8.0 ve sonraki sürümlerde bildirim yayınlamadan önce bildirim kanalını oluşturmanız gerektiğinden, uygulamanız başlar başlamaz bu kodu yürütün. Mevcut bir bildirim kanalı oluşturmak herhangi bir işlem gerçekleştirmediği için bu işlevi tekrar tekrar çağırabilirsiniz.
NotificationChannel
kurucusu, NotificationManager
sınıfındaki sabitlerden birini kullanan bir importance
gerektirir. Bu parametre, bu kanala ait bildirimler için kullanıcının nasıl kesintiye uğratılacağını belirler. Android 7.1 ve önceki sürümleri desteklemek için önceki örnekte gösterildiği gibi setPriority()
ile önceliği ayarlayın.
Bildirim önemini veya önceliğini aşağıdaki örnekte gösterildiği gibi ayarlamanız gerekir ancak sistem, alacağınız uyarı davranışını garanti etmez. Bazı durumlarda sistem, önem düzeyini diğer faktörlere göre değiştirebilir. Kullanıcılar, belirli bir kanalın önem düzeyini diledikleri zaman yeniden tanımlayabilir.
Farklı düzeylerin ne anlama geldiği hakkında daha fazla bilgi edinmek için bildirim önem düzeyleri hakkındaki makaleyi okuyun.
Bildirimin dokunma işlemini ayarlama
Her bildirimin, genellikle uygulamanızda bildirime karşılık gelen bir etkinliği açmak için bir dokunmaya yanıt vermesi gerekir. Bunun için bir PendingIntent
nesnesi ile tanımlanmış bir içerik amacı belirtin ve setContentIntent()
'e iletin.
Aşağıdaki snippet'te, kullanıcı bildirime dokunduğunda bir etkinliği açmak için temel bir intent'in nasıl oluşturulacağı gösterilmektedir:
Kotlin
// Create an explicit intent for an Activity in your app. val intent = Intent(this, AlertDetails::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) // Set the intent that fires when the user taps the notification. .setContentIntent(pendingIntent) .setAutoCancel(true)
Java
// Create an explicit intent for an Activity in your app. Intent intent = new Intent(this, AlertDetails.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) // Set the intent that fires when the user taps the notification. .setContentIntent(pendingIntent) .setAutoCancel(true);
Bu kod, kullanıcı dokunduğunda otomatik olarak bildirimi kaldıran setAutoCancel()
işlevini çağırır.
Önceki örnekte gösterilen setFlags()
yöntemi, kullanıcının bildirimi kullanarak uygulamanızı açtıktan sonra beklediği gezinme deneyimini korur. Aşağıdakilerden biri olan başlattığınız etkinlik türüne bağlı olarak bu özelliği kullanabilirsiniz:
Yalnızca bildirime verilen yanıtlar için var olan bir etkinlik. Kullanıcının normal uygulama kullanımı sırasında bu etkinliğe gitmesinin bir nedeni yoktur. Bu nedenle etkinlik, uygulamanızın mevcut göreve ve geri yığınına eklenmek yerine yeni bir görev başlatır. Bu, önceki örnekte oluşturulan intent türüdür.
Uygulamanızın normal uygulama akışında bulunan bir etkinlik. Bu durumda, etkinlik başlatıldığında bir arka yığın oluşturulur, böylece kullanıcının Geri ve Yukarı düğmeleriyle ilgili beklentileri korunur.
Bildiriminizin amacını yapılandırmanın farklı yolları hakkında daha fazla bilgi için Bildirimden Etkinlik Başlatma bölümüne bakın.
Bildirimi gösterme
Bildirimin görünmesi için NotificationManagerCompat.notify()
işlevini çağırın. Bu işleve bildirim için benzersiz bir kimlik ve NotificationCompat.Builder.build()
işlevinin sonucunu iletin.
Bu durum aşağıdaki örnekte gösterilmektedir:
Kotlin
with(NotificationManagerCompat.from(this)) { if (ActivityCompat.checkSelfPermission( this@MainActivity, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, // grantResults: IntArray) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return@with } // notificationId is a unique int for each notification that you must define. notify(NOTIFICATION_ID, builder.build()) }
Java
with(NotificationManagerCompat.from(this)) { if (ActivityCompat.checkSelfPermission( this@MainActivity, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return } // notificationId is a unique int for each notification that you must define. notify(NOTIFICATION_ID, builder.build()) }
NotificationManagerCompat.notify()
parametresine ilettiğiniz bildirim kimliğini kaydedin. Bildirimi güncellemek veya kaldırmak istediğinizde bu kimliğe ihtiyacınız olacaktır.
Ayrıca, Android 13 ve sonraki sürümleri çalıştıran cihazlarda temel bildirimleri test etmek için bildirimleri manuel olarak açın veya bildirim istemek için bir iletişim kutusu oluşturun.
İşlem düğmeleri ekleme
Bir bildirimde, kullanıcının hızlıca yanıt vermesine olanak tanıyan en fazla üç işlem düğmesi (ör. hatırlatıcıyı erteleme veya kısa mesajı yanıtlama) bulunabilir. Ancak bu işlem düğmeleri, kullanıcı bildirime dokunduğunda gerçekleştirilen işlemi yinelememelidir.
İşlem düğmesi eklemek için addAction()
yöntemine bir PendingIntent
gönderin. Bu işlem, bildirimin varsayılan dokunma işlemini ayarlamaya benzer. Ancak bir etkinlik başlatmak yerine, arka planda bir iş gerçekleştiren BroadcastReceiver
gibi başka işlemler gerçekleştirebilirsiniz. Böylece bu işlem, halihazırda açık olan uygulamayı kesintiye uğratmaz.
Örneğin, aşağıdaki kodda belirli bir alıcıya nasıl yayın gönderileceği gösterilmektedir:
Kotlin
val ACTION_SNOOZE = "snooze" val snoozeIntent = Intent(this, MyBroadcastReceiver::class.java).apply { action = ACTION_SNOOZE putExtra(EXTRA_NOTIFICATION_ID, 0) } val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(this, 0, snoozeIntent, 0) val builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.ic_snooze, getString(R.string.snooze), snoozePendingIntent)
Java
String ACTION_SNOOZE = "snooze" Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class); snoozeIntent.setAction(ACTION_SNOOZE); snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0); PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(this, 0, snoozeIntent, 0); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.ic_snooze, getString(R.string.snooze), snoozePendingIntent);
Arka plan çalışması çalıştırmak üzere BroadcastReceiver
oluşturma hakkında daha fazla bilgi için Yayınlara genel bakış bölümüne bakın.
Bunun yerine, parçaları duraklatma ve atlama gibi medya oynatma düğmeleri içeren bir bildirim oluşturmaya çalışıyorsanız medya kontrolleri içeren bildirim oluşturma başlıklı makaleyi inceleyin.
Doğrudan yanıt işlemi ekleme
Android 7.0 (API düzeyi 24) sürümünde kullanıma sunulan doğrudan yanıt işlemi, kullanıcıların doğrudan bildirime metin girmelerine olanak tanır. Metin daha sonra herhangi bir etkinlik açılmadan uygulamanıza iletilir. Örneğin, kullanıcıların bildirim içinden kısa mesajları yanıtlamasını veya görev listelerini güncellemesini sağlamak için doğrudan yanıt işlemi kullanabilirsiniz.
Doğrudan yanıtlama işlemi, bildirimde metin girişi açan ek bir düğme olarak görünür. Kullanıcı yazma işlemini tamamladığında sistem, metin yanıtını bildirim işlemi için belirttiğiniz intent'e ekler ve intent'i uygulamanıza gönderir.
Yanıt düğmesini ekleme
Doğrudan yanıtı destekleyen bir bildirim işlemi oluşturmak için aşağıdaki adımları uygulayın:
- Bildirim işleminize ekleyebileceğiniz bir
RemoteInput.Builder
sınıfı örneği oluşturun. Bu sınıfın oluşturucusu, sistemin metin girişi için anahtar olarak kullandığı bir dizeyi kabul eder. Uygulamanız daha sonra giriş metnini almak için bu anahtarı kullanır.Kotlin
// Key for the string that's delivered in the action's intent. private val KEY_TEXT_REPLY = "key_text_reply" var replyLabel: String = resources.getString(R.string.reply_label) var remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run { setLabel(replyLabel) build() }
Java
// Key for the string that's delivered in the action's intent. private static final String KEY_TEXT_REPLY = "key_text_reply"; String replyLabel = getResources().getString(R.string.reply_label); RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) .setLabel(replyLabel) .build();
- Yanıt işlemi için bir
PendingIntent
oluşturun.Kotlin
// Build a PendingIntent for the reply action to trigger. var replyPendingIntent: PendingIntent = PendingIntent.getBroadcast(applicationContext, conversation.getConversationId(), getMessageReplyIntent(conversation.getConversationId()), PendingIntent.FLAG_UPDATE_CURRENT)
Java
// Build a PendingIntent for the reply action to trigger. PendingIntent replyPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), conversation.getConversationId(), getMessageReplyIntent(conversation.getConversationId()), PendingIntent.FLAG_UPDATE_CURRENT);
addRemoteInput()
kullanarakRemoteInput
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();
- İşlemi bir bildirime uygulayıp bildirim gönderin.
Kotlin
// Build the notification and add the action. val newMessageNotification = Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .addAction(action) .build() // Issue the notification. with(NotificationManagerCompat.from(this)) { notificationManager.notify(notificationId, newMessageNotification) }
Java
// Build the notification and add the action. Notification newMessageNotification = new Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .addAction(action) .build(); // Issue the notification. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, newMessageNotification);
Sistem, kullanıcı bildirim işlemini tetiklediğinde kullanıcıdan bir yanıt girmesini ister (Şekil 4).
Yanıttan kullanıcı girişini alma
Bildirimin yanıt kullanıcı arayüzünden kullanıcı girişi almak için RemoteInput.getResultsFromIntent()
işlevini çağırın ve BroadcastReceiver
tarafından alınan Intent
değerini iletin:
Kotlin
private fun getMessageText(intent: Intent): CharSequence? { return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY) }
Java
private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); if (remoteInput != null) { return remoteInput.getCharSequence(KEY_TEXT_REPLY); } return null; }
Metni işledikten sonra, aynı kimlik ve etiketle (kullanılıyorsa) NotificationManagerCompat.notify()
'ü çağırarak bildirimi güncelleyin. Bu, doğrudan yanıt kullanıcı arayüzünü gizlemek ve kullanıcıya yanıtının alındığını ve doğru şekilde işlendiğini onaylamak için gereklidir.
Kotlin
// Build a new notification, which informs the user that the system // handled their interaction with the previous notification. val repliedNotification = Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentText(getString(R.string.replied)) .build() // Issue the new notification. NotificationManagerCompat.from(this).apply { notificationManager.notify(notificationId, repliedNotification) }
Java
// Build a new notification, which informs the user that the system // handled their interaction with the previous notification. Notification repliedNotification = new Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentText(getString(R.string.replied)) .build(); // Issue the new notification. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, repliedNotification);
Bu yeni bildirimle çalışırken alıcının onReceive()
yöntemine iletilen içeriği kullanın.
setRemoteInputHistory()
simgesini kullanarak yanıtı bildirimin alt kısmına ekleyin.
Ancak bir mesajlaşma uygulaması geliştiriyorsanız mesajlaşma tarzında bir bildirim oluşturun ve yeni mesajı görüşmeye ekleyin.
Mesajlaşma uygulamalarından gelen bildirimler hakkında daha fazla bilgi için mesajlaşma uygulamalarıyla ilgili en iyi uygulamalar bölümüne bakın.
İlerleme çubuğu ekleme
Bildirimler, kullanıcılara devam eden bir işlemin durumunu gösteren animasyonlu bir ilerleme göstergesi içerebilir.
İşlemin ne kadarının tamamlandığını tahmin edebiliyorsanız setProgress(max, progress,
false)
işlevini çağırarak göstergenin "belirleyici" biçimini (Şekil 5'te gösterildiği gibi) kullanın.
İlk parametre, "tamamlandı" değerinin ne olduğunu belirtir (ör. 100). İkincisi, ne kadarının tamamlandığıdır. Sonuncusu, bunun belirli bir ilerleme çubuğu olduğunu gösterir.
İşleminiz devam ederken progress
için güncel bir değerle setProgress(max, progress,
false)
öğesini sürekli olarak çağırın ve aşağıdaki örnekte gösterildiği gibi bildirimi yeniden gönderin.
Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentTitle("Picture Download") setContentText("Download in progress") setSmallIcon(R.drawable.ic_notification) setPriority(NotificationCompat.PRIORITY_LOW) } val PROGRESS_MAX = 100 val PROGRESS_CURRENT = 0 NotificationManagerCompat.from(this).apply { // Issue the initial notification with zero progress. builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false) notify(notificationId, builder.build()) // Do the job that tracks the progress here. // Usually, this is in a worker thread. // To show progress, update PROGRESS_CURRENT and update the notification with: // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false); // notificationManager.notify(notificationId, builder.build()); // When done, update the notification once more to remove the progress bar. builder.setContentText("Download complete") .setProgress(0, 0, false) notify(notificationId, builder.build()) }
Java
... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentTitle("Picture Download") .setContentText("Download in progress") .setSmallIcon(R.drawable.ic_notification) .setPriority(NotificationCompat.PRIORITY_LOW); // Issue the initial notification with zero progress. int PROGRESS_MAX = 100; int PROGRESS_CURRENT = 0; builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false); notificationManager.notify(notificationId, builder.build()); // Do the job that tracks the progress here. // Usually, this is in a worker thread. // To show progress, update PROGRESS_CURRENT and update the notification with: // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false); // notificationManager.notify(notificationId, builder.build()); // When done, update the notification once more to remove the progress bar. builder.setContentText("Download complete") .setProgress(0,0,false); notificationManager.notify(notificationId, builder.build());
İşlemin sonunda progress
, max
'a eşit olmalıdır. İlerleme çubuğunu, işlemin tamamlandığını belirtmek veya kaldırmak için kullanabilirsiniz. Her iki durumda da bildirim metnini, işlemin tamamlandığını gösterecek şekilde güncelleyin. İlerleme çubuğunu kaldırmak için setProgress(0, 0, false)
numaralı telefonu arayın.
Belirsiz bir ilerleme çubuğu (tamamlanma yüzdesini göstermeyen bir çubuk) görüntülemek için setProgress(0, 0, true)
işlevini çağırın. Sonuç, önceki ilerleme çubuğuyla aynı stile sahip bir göstergedir. Tek fark, tamamlanmayı göstermeyen sürekli bir animasyon olmasıdır. İlerleme animasyonu, setProgress(0, 0, false)
'yi çağırıp bildirimi etkinlik göstergesinden kaldırana kadar çalışır.
İşlemin tamamlandığını belirtmek için bildirim metnini değiştirmeyi unutmayın.
Sistem genelinde bir kategori belirleyin
Android, kullanıcı Rahatsız Etme modunu etkinleştirdiğinde kullanıcıyı belirli bir bildirimle rahatsız edip etmeyeceği belirlemek için sistem genelinde önceden tanımlanmış kategorileri kullanır.
Bildiriminiz NotificationCompat
'te tanımlanan bildirim kategorilerinden birine (ör. CATEGORY_ALARM
, CATEGORY_REMINDER
, CATEGORY_EVENT
veya CATEGORY_CALL
) aitse uygun kategoriyi setCategory()
'ye ileterek bildirimi bu kategoride olduğunu belirtin:
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setCategory(NotificationCompat.CATEGORY_MESSAGE)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setCategory(NotificationCompat.CATEGORY_MESSAGE);
Sistem, cihaz Rahatsız Etmeyin modunda olduğunda bildiriminizin görüntülenmesi hakkında karar vermek için bildirim kategorinizle ilgili bu bilgileri kullanır. Ancak sistem genelinde bir kategori belirlemeniz gerekmez. Yalnızca bildirimleriniz NotificationCompat
tarafından tanımlanan kategorilerden biriyle eşleşiyorsa bunu yapın.
Acil mesaj gösterme
Uygulamanızın, gelen telefon araması veya çalan alarm gibi acil ve zamana duyarlı bir mesaj göstermesi gerekebilir. Bu gibi durumlarda, bildiriminizle tam ekran intent'i ilişkilendirebilirsiniz.
Bildirim tetiklendiğinde kullanıcılar, cihazın kilit durumuna bağlı olarak aşağıdakilerden birini görür:
- Kullanıcının cihazı kilitliyse kilit ekranını kaplayan tam ekran bir etkinlik gösterilir.
- Kullanıcının cihazının kilidi açıksa bildirim, bildirimi işleme veya kapatma seçeneklerini içeren genişletilmiş bir biçimde görünür.
Aşağıdaki kod snippet'inde, bildiriminizin tam ekran intent ile nasıl ilişkilendirileceği gösterilmektedir:
Kotlin
val fullScreenIntent = Intent(this, ImportantActivity::class.java) val fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT) var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setFullScreenIntent(fullScreenPendingIntent, true)
Java
Intent fullScreenIntent = new Intent(this, ImportantActivity.class); PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setFullScreenIntent(fullScreenPendingIntent, true);
Kilit ekranının görünürlüğünü ayarlama
Kilit ekranındaki bildirimde gösterilen ayrıntı düzeyini kontrol etmek için setVisibility()
kodunu arayın ve aşağıdaki değerlerden birini belirtin:
VISIBILITY_PUBLIC
: Bildirimin tam içeriği kilit ekranında gösterilir.VISIBILITY_SECRET
: Bildirimin hiçbir bölümü kilit ekranında gösterilmez.VISIBILITY_PRIVATE
: Kilit ekranında yalnızca temel bilgiler (ör. bildirimin simgesi ve içerik başlığı) gösterilir. Bildirimin tam içeriği gösterilmez.
VISIBILITY_PRIVATE
değerini ayarlarken bildirim içeriğinin belirli ayrıntıları gizleyen alternatif bir sürümünü de sağlayabilirsiniz. Örneğin, bir SMS uygulamasında "3 yeni kısa mesajınız var" şeklinde bir bildirim görüntülenebilir ancak mesaj içerikleri ve gönderenleri gizlenir. Bu alternatif bildirimi sağlamak için önce her zamanki gibi NotificationCompat.Builder
ile alternatif bildirimi oluşturun. Ardından, alternatif bildirimi setPublicVersion()
ile normal bildirime ekleyin.
Kullanıcının, bildirimlerinin kilit ekranında görünür olup olmayacağı konusunda her zaman nihai kontrole sahip olduğunu ve bunları uygulamanızın bildirim kanallarına göre kontrol edebileceğini unutmayın.
Bildirimleri güncelleme
Bir bildirimi yayınladıktan sonra güncellemek için daha önce kullandığınız kimliği ileterek NotificationManagerCompat.notify()
numaralı telefonu tekrar arayın. Önceki bildirim kapatılırsa bunun yerine yeni bir bildirim oluşturulur.
İsteğe bağlı olarak setOnlyAlertOnce()
değerini çağırarak bildiriminizin kullanıcıyı yalnızca ilk kez göründüğünde (sonraki güncellemelerde değil) ses, titreşim veya görsel ipuçlarıyla kesintiye uğratmasını sağlayabilirsiniz.
Bildirimi kaldırma
Bildirimler aşağıdakilerden biri gerçekleşene kadar görünür kalır:
- Kullanıcı bildirimi kapatır.
- Bildirimi oluştururken
setAutoCancel()
çağrısı yaparsanız kullanıcı bildirime dokunur. - Belirli bir bildirim kimliği için
cancel()
işlevini çağırırsınız. Bu yöntem, devam eden bildirimleri de siler. cancelAll()
çağrısı yaptığınızda daha önce gönderdiğiniz tüm bildirimler kaldırılır.- Bildirimi oluştururken
setTimeoutAfter()
kullanarak bir zaman aşımı ayarlarsanız belirtilen süre dolar. Gerekirse bir bildirimi, belirtilen zaman aşımı süresi dolmadan iptal edebilirsiniz.
Mesajlaşma uygulamaları için en iyi uygulamalar
Mesajlaşma ve sohbet uygulamalarınız için bildirim oluştururken burada listelenen en iyi uygulamalardan yararlanın.
MessagingStyle'ı kullanma
Android 7.0 (API düzeyi 24) sürümünden itibaren Android, mesajlaşma içeriği için özel olarak bir bildirim stili şablonu sağlar. NotificationCompat.MessagingStyle
sınıfını kullanarak bildirimde gösterilen etiketlerden bazılarını (ör. ileti dizisi başlığı, ek mesajlar ve bildirimin içerik görünümü) değiştirebilirsiniz.
Aşağıdaki kod snippet'inde, MessagingStyle
sınıfı kullanılarak bir bildirimin stilinin nasıl özelleştirileceği gösterilmektedir.
Kotlin
val user = Person.Builder() .setIcon(userIcon) .setName(userName) .build() val notification = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("2 new messages with $sender") .setContentText(subject) .setSmallIcon(R.drawable.new_message) .setStyle(NotificationCompat.MessagingStyle(user) .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson()) .addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson()) ) .build()
Java
Person user = new Person.Builder() .setIcon(userIcon) .setName(userName) .build(); Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("2 new messages with " + sender) .setContentText(subject) .setSmallIcon(R.drawable.new_message) .setStyle(new NotificationCompat.MessagingStyle(user) .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson()) .addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson()) ) .build();
Android 9.0 (API düzeyi 28) sürümünden itibaren, bildirimin ve avatarlarının optimum şekilde oluşturulması için Person
sınıfının kullanılması da gereklidir.
NotificationCompat.MessagingStyle
kullanırken aşağıdakileri yapın:
- İkiden fazla kişinin bulunduğu grup sohbetlerine başlık eklemek için
MessagingStyle.setConversationTitle()
simgesine dokunun. İyi bir konuşma başlığı, grup sohbetinin adı veya bir adı yoksa sohbetteki katılımcıların listesi olabilir. Bu olmadan, mesaj görüşmedeki en son mesajın göndereniyle bire bir görüşmeye ait olarak yanlış anlaşılabilir. - Resim gibi medya mesajları eklemek için
MessagingStyle.setData()
yöntemini kullanın. image/* kalıbının MIME türleri desteklenir.
Doğrudan yanıt özelliğini kullanma
Doğrudan yanıt, kullanıcıların mesajları satır içinde yanıtlamasına olanak tanır.
- Kullanıcı satır içi yanıt işlemiyle yanıt verdikten sonra
MessagingStyle
bildirimini güncellemek içinMessagingStyle.addMessage()
simgesini kullanın ve bildirimi geri çekmeyin veya iptal etmeyin. Bildirimi iptal etmemek, kullanıcının bildirim üzerinden birden fazla yanıt göndermesine olanak tanır. - Satır içi yanıtlama işlemini Wear OS ile uyumlu hale getirmek için
Action.WearableExtender.setHintDisplayInlineAction(true)
işlevini çağırın. - Bildirime geçmiş mesajlar ekleyerek doğrudan yanıtladığınız bir görüşmeye bağlam sağlamak için
addHistoricMessage()
yöntemini kullanın.
Akıllı Yanıt'ı etkinleştirme
- Akıllı Yanıt'ı etkinleştirmek için yanıt işleminde
setAllowGeneratedResponses(true)
simgesini çağırın. Bu sayede, bildirim bir Wear OS cihazına köprülendiğinde kullanıcılar Akıllı Yanıt yanıtlarını görebilir. Akıllı Yanıt yanıtları,NotificationCompat.MessagingStyle
bildirimi tarafından sağlanan bağlamı kullanan tamamen izleme modundaki bir makine öğrenimi modeli tarafından oluşturulur ve yanıtları oluşturmak için internete hiçbir veri yüklenmez.
Bildirim meta verilerini ekleme
- Cihaz
Do Not Disturb mode
durumundayken uygulama bildirimlerinizin nasıl ele alınacağını sisteme bildirmek için bildirim meta verilerini atayın. Örneğin, Rahatsız Etmeyin modunu geçersiz kılmak içinaddPerson()
veyasetCategory(Notification.CATEGORY_MESSAGE)
yöntemini kullanın.