Bildirimler, uygulamanızın kullanılmadığı zamanlarda yer alan etkinlikler hakkında kısa ve zamanında bilgiler sağlar. Bu dokümanda, çeşitli özelliklerle nasıl bildirim oluşturulacağı gösterilmektedir. Android'de bildirimlerin nasıl göründüğüne dair tanıtım için Bildirimlere genel bakış konusuna göz atın. Bildirimleri kullanan örnek kod için GitHub'daki Kişiler örneğine göz atın.
Bu sayfadaki kod, AndroidX Kitaplığı'ndaki NotificationCompat
API'lerini kullanmaktadır. Bu API'ler, yalnızca Android'in yeni sürümlerinde kullanılabilen özellikleri eklerken Android 9 (API düzeyi 28) ile uyumluluk sağlamaya devam etmenizi sağlar. Ancak satır içi yanıt işlemi gibi bazı özellikler, önceki sürümlerde işlem yapılmamasına neden olur.
AndroidX Core Library'yi ekleyin
Android Studio ile oluşturulan çoğu proje NotificationCompat
kullanımı için gerekli bağımlılıkları içerse de modül düzeyindeki build.gradle
dosyanızın aşağıdaki bağımlılığı içerdiğini doğrulayın:
Modern
dependencies { implementation "androidx.core:core:2.2.0" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:2.2.0") }
Temel bildirim oluşturma
En temel ve en kompakt biçimindeki bildirimler (daraltılmış form olarak da bilinir) bir simge, başlık ve az miktarda metin içeriği görüntüler. Bu bölümde, kullanıcının uygulamanızda bir etkinliği başlatmak için dokunabileceği bildirimin nasıl oluşturulacağı gösterilmektedir.
Bir bildirimin her bir bölümüyle ilgili daha fazla ayrıntı için bildirim anatomisi konusunu okuyun.
Çalışma zamanı iznini bildirme
Android 13 (API düzeyi 33) ve sonraki sürümler, bir uygulamadan muaf olmayan (Ön Plan Hizmeti (FGS)) bildirimleri yayınlamak için çalışma zamanı iznini destekler.
Uygulamanızın manifest dosyasında beyan etmeniz gereken izin, aşağıdaki kod snippet'inde görünür:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
Çalışma zamanı izinleri hakkında daha fazla bilgi için Bildirim çalışma zamanı izni bölümüne bakın.
Bildirim içeriğini ayarlama
Başlamak için bir NotificationCompat.Builder
nesnesi kullanarak bildirimin içeriğini ve kanalını ayarlayın. Aşağıdaki örnekte, şunlarla bildirimin nasıl oluşturulacağı gösterilmektedir:
setSmallIcon()
tarafından ayarlanmış küçük bir simge. Bu, gerekli olan tek kullanıcı tarafından görülebilen içeriktir.setContentTitle()
tarafından ayarlanan bir başlık.setContentText()
tarafından ayarlanan gövde metni.setPriority()
tarafından ayarlanan bildirim önceliği. Öncelik, bildirimin Android 7.1 ve önceki sürümlerde ne kadar rahatsız edici olduğunu belirler. Android 8.0 ve sonraki sürümler için bunun yerine, bir sonraki bölümde gösterildiği gibi kanal önem derecesini ayarlayın.
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationCompat.Builder
oluşturucu, bir kanal kimliği sağlamanızı gerektirir. Bu, Android 8.0 (API düzeyi 26) ve sonraki sürümlerle uyumluluk için gerekli olsa da önceki sürümler tarafından yoksayılır.
Varsayılan olarak, bildirimin metin içeriği bir satıra sığacak şekilde kesilir. Genişletilebilir bir bildirim oluşturarak ek bilgiler gösterebilirsiniz.
Bildiriminizin daha uzun olmasını istiyorsanız setStyle()
ile bir stil şablonu ekleyerek genişletilebilir bildirimi etkinleştirebilirsiniz.
Örneğin, aşağıdaki kod daha büyük bir metin alanı oluşturur:
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Much longer text that cannot fit one line...") .setStyle(NotificationCompat.BigTextStyle() .bigText("Much longer text that cannot fit one line...")) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Much longer text that cannot fit one line...") .setStyle(new NotificationCompat.BigTextStyle() .bigText("Much longer text that cannot fit one line...")) .setPriority(NotificationCompat.PRIORITY_DEFAULT);
Resim ve medya oynatma denetimleri ekleme de dahil olmak üzere diğer büyük bildirim stilleri hakkında daha fazla bilgi için Genişletilebilir bildirim oluşturma bölümüne bakın.
Kanal oluşturma ve önem düzeyini ayarlama
Android 8.0 ve sonraki sürümlerde bildirimi iletmeden önce, bir NotificationChannel
örneğini createNotificationChannel()
cihazına ileterek uygulamanızın bildirim kanalını sisteme kaydedin.
Aşağıdaki kod, SDK_INT
sürümündeki bir koşul tarafından engelleniyor:
Kotlin
private fun createNotificationChannel() { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is not in the Support Library. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val name = getString(R.string.channel_name) val descriptionText = getString(R.string.channel_description) val importance = NotificationManager.IMPORTANCE_DEFAULT val channel = NotificationChannel(CHANNEL_ID, name, importance).apply { description = descriptionText } // Register the channel with the system. val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) } }
Java
private void createNotificationChannel() { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is not in the Support Library. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence name = getString(R.string.channel_name); String description = getString(R.string.channel_description); int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); channel.setDescription(description); // Register the channel with the system; you can't change the importance // or other notification behaviors after this. NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } }
Android 8.0 ve sonraki sürümlerde herhangi bir bildirim yayınlamadan önce bildirim kanalını oluşturmanız gerektiğinden, bu kodu uygulamanız başlar başlamaz yürütün. Mevcut bir bildirim kanalı oluşturulması hiçbir işlem yapmadığından bunu tekrar tekrar çağırmak güvenlidir.
NotificationChannel
oluşturucusu, NotificationManager
sınıfındaki sabit değerlerden birini kullanan bir importance
gerektirir. Bu parametre, bu kanala ait bildirimlerde kullanıcının çalışmasını nasıl kesintiye uğratacağını belirler. Önceki örnekte gösterildiği gibi önceliği, setPriority()
ile Android 7.1 ve önceki sürümleri destekleyecek şekilde ayarlayın.
Bildirim önemini veya önceliğini aşağıdaki örnekte gösterildiği gibi ayarlamanız gerekse de sistem, alacağınız uyarı davranışını garanti etmez. Bazı durumlarda, sistem, önem düzeyini diğer faktörlere bağlı olarak değiştirebilir ve kullanıcı, belirli bir kanalın önem düzeyini dilediği zaman yeniden tanımlayabilir.
Farklı düzeylerin ne anlama geldiği hakkında daha fazla bilgi edinmek için bildirim önem düzeyleri konusunu okuyun.
Bildirimin dokunma işlemini ayarlama
Her bildirimin bir dokunuşa yanıt vermesi gerekir. Bu, genellikle uygulamanızda bildirime karşılık gelen bir etkinliğin açılmasıdır. Bunu yapmak için PendingIntent
nesnesiyle tanımlanmış bir içerik amacı belirtin ve bunu setContentIntent()
'e iletin.
Aşağıdaki snippet'te, kullanıcı bildirime dokunduğunda bir etkinliği açmak için temel niyetin nasıl oluşturulacağı gösterilmektedir:
Kotlin
// Create an explicit intent for an Activity in your app. val intent = Intent(this, AlertDetails::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) // Set the intent that fires when the user taps the notification. .setContentIntent(pendingIntent) .setAutoCancel(true)
Java
// Create an explicit intent for an Activity in your app. Intent intent = new Intent(this, AlertDetails.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) // Set the intent that fires when the user taps the notification. .setContentIntent(pendingIntent) .setAutoCancel(true);
Bu kod, kullanıcı dokunduğunda bildirimi otomatik olarak kaldıran setAutoCancel()
işlevini çağırır.
Yukarıdaki örnekte gösterilen setFlags()
yöntemi, kullanıcı bildirimi kullanarak uygulamanızı açtıktan sonra kullanıcının beklenen gezinme deneyimini korur. Bu aracı, başladığınız aktivitenin türüne bağlı olarak kullanabilirsiniz. Bunlardan biri olabilir:
Yalnızca bildirime verilen yanıtlar için mevcut olan bir etkinlik. Kullanıcının normal uygulama kullanımı sırasında bu etkinliğe gitmesi için bir neden yoktur. Bu nedenle, etkinlik, uygulamanızın mevcut görev ve arka yığınına eklenmek yerine yeni bir görev başlatır. Bu, önceki örnekte oluşturulan amaç türüdür.
Uygulamanızın normal uygulama akışında bulunan bir etkinlik. Bu durumda, etkinlik başlatıldığında kullanıcının Geri ve Yukarı düğmelerine ilişkin beklentilerinin korunması için bir arka yığın oluşturulur.
Bildiriminizin amacını yapılandırmanın farklı yolları hakkında daha fazla bilgi için Bildirimden Etkinlik Başlatma bölümüne bakın.
Bildirimi göster
Bildirimin görünmesini sağlamak için NotificationManagerCompat.notify()
yöntemini çağırarak bildirim ve NotificationCompat.Builder.build()
sonucu için benzersiz bir kimlik iletin.
Bu, aşağıdaki örnekte gösterilmiştir:
Kotlin
with(NotificationManagerCompat.from(this)) { if (ActivityCompat.checkSelfPermission( this@MainActivity, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, // grantResults: IntArray) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return@with } // notificationId is a unique int for each notification that you must define. notify(NOTIFICATION_ID, builder.build()) }
Java
with(NotificationManagerCompat.from(this)) { if (ActivityCompat.checkSelfPermission( this@MainActivity, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return } // notificationId is a unique int for each notification that you must define. notify(NOTIFICATION_ID, builder.build()) }
NotificationManagerCompat.notify()
hizmetine ilettiğiniz bildirim kimliğini kaydedin. Bildirimi güncellemek veya bildirimi kaldırmak istediğinizde bu kimliğe ihtiyacınız olacaktır.
Ayrıca, Android 13 ve sonraki sürümleri çalıştıran cihazlarda temel bildirimleri test etmek için bildirimleri manuel olarak açın veya bildirim isteğinde bulunabileceğiniz bir iletişim kutusu oluşturun.
İşlem düğmesi ekleme
Bir bildirimde, kullanıcının hızlı yanıt vermesine olanak tanıyan (örneğin, bir hatırlatıcıyı erteleme veya bir kısa mesajı yanıtlama) üç işlem düğmesi bulunabilir. Ancak bu işlem düğmeleri, kullanıcı bildirime dokunduğunda gerçekleştirilen işlemi kopyalamamalıdır.
İşlem düğmesi eklemek için addAction()
yöntemine PendingIntent
iletin. Bu, bildirimin varsayılan dokunma işlemini ayarlamak gibidir. Tek fark, bir etkinliği başlatmak yerine arka planda iş gerçekleştiren bir BroadcastReceiver
başlatmak gibi başka şeyler de yapmaktır. Böylece işlemin, açık durumdaki uygulamayı kesintiye uğratmaması sağlanır.
Örneğin, aşağıdaki kod bir yayının belirli bir alıcıya nasıl gönderileceğini gösterir:
Kotlin
val ACTION_SNOOZE = "snooze" val snoozeIntent = Intent(this, MyBroadcastReceiver::class.java).apply { action = ACTION_SNOOZE putExtra(EXTRA_NOTIFICATION_ID, 0) } val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(this, 0, snoozeIntent, 0) val builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.ic_snooze, getString(R.string.snooze), snoozePendingIntent)
Java
String ACTION_SNOOZE = "snooze" Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class); snoozeIntent.setAction(ACTION_SNOOZE); snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0); PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(this, 0, snoozeIntent, 0); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.ic_snooze, getString(R.string.snooze), snoozePendingIntent);
Arka plan çalışması çalıştırmak için bir BroadcastReceiver
oluşturma hakkında daha fazla bilgi için Yayınlara genel bakış konusuna bakın.
Bunun yerine, parçaları duraklatmak ve atlamak gibi medya oynatma düğmeleriyle bildirim oluşturmaya çalışıyorsanız medya kontrolleriyle nasıl bildirim oluşturabileceğinizi öğrenin.
Doğrudan yanıt işlemi ekleyin
Android 7.0'da (API düzeyi 24) kullanıma sunulan doğrudan yanıt işlemi, kullanıcıların doğrudan bildirime metin girmelerine olanak tanır. Metin, daha sonra herhangi bir etkinlik açılmadan uygulamanıza iletilir. Örneğin, kullanıcıların kısa mesajları yanıtlamasına veya bildirimin içinden görev listelerini güncellemesine izin vermek için doğrudan yanıtlama işlemi kullanabilirsiniz.
Doğrudan yanıt işlemi, bildirimde bir metin girişi açan ek düğme olarak görünür. Kullanıcı yazmayı bitirdiğinde, sistem, bildirim işlemi için belirttiğiniz amaca metin yanıtını ekler ve niyeti uygulamanıza gönderir.
Yanıtla düğmesini ekleyin
Doğrudan yanıt özelliğini destekleyen bir bildirim işlemi oluşturmak için şu adımları uygulayın:
- Bildirim işleminize ekleyebileceğiniz bir
RemoteInput.Builder
örneği oluşturun. Bu sınıfın oluşturucusu, sistemin metin girişi için anahtar olarak kullandığı bir dizeyi kabul eder. Uygulamanız daha sonra giriş metnini almak için bu anahtarı kullanır.Kotlin
// Key for the string that's delivered in the action's intent. private val KEY_TEXT_REPLY = "key_text_reply" var replyLabel: String = resources.getString(R.string.reply_label) var remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run { setLabel(replyLabel) build() }
Java
// Key for the string that's delivered in the action's intent. private static final String KEY_TEXT_REPLY = "key_text_reply"; String replyLabel = getResources().getString(R.string.reply_label); RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) .setLabel(replyLabel) .build();
- 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);
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ın ve bildirimi gönderin.
Kotlin
// Build the notification and add the action. val newMessageNotification = Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .addAction(action) .build() // Issue the notification. with(NotificationManagerCompat.from(this)) { notificationManager.notify(notificationId, newMessageNotification) }
Java
// Build the notification and add the action. Notification newMessageNotification = new Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .addAction(action) .build(); // Issue the notification. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, newMessageNotification);
Kullanıcı bildirim işlemini tetiklediğinde sistem, kullanıcıdan Şekil 4'te gösterildiği gibi bir yanıt girmesini ister.
Yanıttan kullanıcı girişini al
Bildirimin yanıt kullanıcı arayüzünden kullanıcı girişini almak için BroadcastReceiver
tarafından alınan Intent
bilgisini ileterek RemoteInput.getResultsFromIntent()
çağrısı yapın:
Kotlin
private fun getMessageText(intent: Intent): CharSequence? { return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY) }
Java
private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); if (remoteInput != null) { return remoteInput.getCharSequence(KEY_TEXT_REPLY); } return null; }
Metni işledikten sonra, kullanılıyorsa aynı kimlik ve etiketle NotificationManagerCompat.notify()
yöntemini çağırarak bildirimi güncelleyin. Bu, doğrudan yanıt kullanıcı arayüzünü gizlemek ve kullanıcıya yanıtının doğru şekilde alındığını ve işlendiğini onaylamak için gereklidir.
Kotlin
// Build a new notification, which informs the user that the system // handled their interaction with the previous notification. val repliedNotification = Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentText(getString(R.string.replied)) .build() // Issue the new notification. NotificationManagerCompat.from(this).apply { notificationManager.notify(notificationId, repliedNotification) }
Java
// Build a new notification, which informs the user that the system // handled their interaction with the previous notification. Notification repliedNotification = new Notification.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_message) .setContentText(getString(R.string.replied)) .build(); // Issue the new notification. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, repliedNotification);
Bu yeni bildirimle çalışırken alıcının onReceive()
yöntemine aktarılan bağlamı kullanın.
setRemoteInputHistory()
numaralı telefonu arayarak yanıtı bildirimin alt kısmına ekleyin.
Ancak bir mesajlaşma uygulaması oluşturuyorsanız mesajlaşma tarzında bir bildirim oluşturun ve yeni mesajı görüşmeye ekleyin.
Mesajlaşma uygulamalarından gelen bildirimlerle ilgili daha fazla öneri için Mesajlaşma uygulamalarına yönelik en iyi uygulamalar bölümüne bakın.
İlerleme çubuğu ekleme
Bildirimler, kullanıcılara devam eden bir işlemin durumunu gösteren animasyonlu bir ilerleme göstergesi içerebilir.
İşlemin ne kadarının tamamlandığını herhangi bir zamanda tahmin edebiliyorsanız, setProgress(max, progress,
false)
yöntemini çağırarak göstergenin "belirgin" biçimini (Şekil 5'te gösterildiği gibi) kullanın.
Birinci parametre "complete" değeridir (ör. 100). İkincisi, ne kadar
tamamlandığıdır. Sonuncusu, bunun belirli bir ilerleme
çubuğu olduğunu belirtir.
İşleminiz devam ederken, progress
için güncellenmiş bir değerle setProgress(max, progress,
false)
numaralı telefonu sürekli olarak çağırın ve aşağıdaki örnekte gösterildiği gibi bildirimi yeniden gönderin.
Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentTitle("Picture Download") setContentText("Download in progress") setSmallIcon(R.drawable.ic_notification) setPriority(NotificationCompat.PRIORITY_LOW) } val PROGRESS_MAX = 100 val PROGRESS_CURRENT = 0 NotificationManagerCompat.from(this).apply { // Issue the initial notification with zero progress. builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false) notify(notificationId, builder.build()) // Do the job that tracks the progress here. // Usually, this is in a worker thread. // To show progress, update PROGRESS_CURRENT and update the notification with: // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false); // notificationManager.notify(notificationId, builder.build()); // When done, update the notification once more to remove the progress bar. builder.setContentText("Download complete") .setProgress(0, 0, false) notify(notificationId, builder.build()) }
Java
... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentTitle("Picture Download") .setContentText("Download in progress") .setSmallIcon(R.drawable.ic_notification) .setPriority(NotificationCompat.PRIORITY_LOW); // Issue the initial notification with zero progress. int PROGRESS_MAX = 100; int PROGRESS_CURRENT = 0; builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false); notificationManager.notify(notificationId, builder.build()); // Do the job that tracks the progress here. // Usually, this is in a worker thread. // To show progress, update PROGRESS_CURRENT and update the notification with: // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false); // notificationManager.notify(notificationId, builder.build()); // When done, update the notification once more to remove the progress bar. builder.setContentText("Download complete") .setProgress(0,0,false); notificationManager.notify(notificationId, builder.build());
İşlemin sonunda progress
, max
değerine eşit olmalıdır. İşlemin tamamlandığını göstermek için ilerleme
çubuğundan ayrılabilir veya işlemi kaldırabilirsiniz. Her iki durumda da, bildirim metnini işlemin tamamlandığını gösterecek şekilde güncelleyin. İlerleme çubuğunu kaldırmak için setProgress(0, 0, false)
numaralı telefonu arayın.
Belirsiz bir ilerleme çubuğu (tamamlanma yüzdesini göstermeyen bir çubuk) görüntülemek için setProgress(0, 0, true)
yöntemini çağırın. Sonuç, önceki ilerleme çubuğuyla aynı stile sahip bir göstergedir ancak bu, tamamlandığını belirtmeyen sürekli bir animasyondur. İlerleme animasyonu, siz setProgress(0, 0, false)
çağrısı yapana kadar çalışır ve daha sonra, etkinlik göstergesini kaldırmak için bildirimi günceller.
Bildirim metnini işlemin tamamlandığını belirtecek şekilde değiştirmeyi unutmayın.
Sistem genelinde bir kategori ayarlayın
Android, kullanıcı Rahatsız Etmeyin modunu etkinleştirdiğinde belirli bir bildirimle kullanıcının rahatsız olup olmayacağını belirlemek için sistem genelinde önceden tanımlanmış kategoriler kullanır.
Bildiriminiz
NotificationCompat
içinde tanımlanan
CATEGORY_ALARM
,
CATEGORY_REMINDER
,
CATEGORY_EVENT
veya
CATEGORY_CALL
gibi bildirim kategorilerinden
birine giriyorsa uygun kategoriyi
setCategory()
tarafına ileterek bu durumu bildirin:
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setCategory(NotificationCompat.CATEGORY_MESSAGE)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setCategory(NotificationCompat.CATEGORY_MESSAGE);
Sistem, cihaz Rahatsız Etmeyin modundayken bildiriminizin görüntülenmesi konusunda karar vermek için bildirim kategorinizle ilgili bu bilgileri kullanır. Ancak, sistem genelinde bir kategori ayarlamanız gerekmez. Bunu yalnızca bildirimleriniz NotificationCompat
içinde tanımlanan kategorilerden biriyle eşleşiyorsa yapın.
Acil mesaj göster
Uygulamanızın, gelen bir telefon araması veya çalan bir alarm gibi acil, zamana duyarlı bir mesaj göstermesi gerekebilir. Bu durumlarda, tam ekran intent'i bildiriminizle ilişkilendirebilirsiniz.
Bildirim çağrıldığında, kullanıcılar cihazın kilit durumuna bağlı olarak aşağıdakilerden birini görür:
- Kullanıcının cihazı kilitlenirse kilit ekranını kapsayan tam ekran bir etkinlik görünür.
- Kullanıcının cihazının kilidi açıksa bildirim, işleme veya bildirim kapatma seçeneklerini içeren genişletilmiş bir biçimde görünür.
Aşağıdaki kod snippet'i, bildiriminizi tam ekran intent ile nasıl ilişkilendireceğinizi gösterir:
Kotlin
val fullScreenIntent = Intent(this, ImportantActivity::class.java) val fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT) var builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setFullScreenIntent(fullScreenPendingIntent, true)
Java
Intent fullScreenIntent = new Intent(this, ImportantActivity.class); PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setFullScreenIntent(fullScreenPendingIntent, true);
Kilit ekranı görünürlüğünü ayarlama
Kilit ekranından, bildirimde gösterilen ayrıntı düzeyini kontrol etmek için setVisibility()
numaralı telefonu arayın ve aşağıdaki değerlerden birini belirtin:
VISIBILITY_PUBLIC
: Bildirimin tüm içeriği kilit ekranında gösterilir.VISIBILITY_SECRET
: Bildirimin hiçbir bölümü kilit ekranında gösterilmez.VISIBILITY_PRIVATE
: Kilit ekranında yalnızca bildirimin simgesi ve içerik başlığı gibi temel bilgiler gösterilir. Bildirimin tüm içeriği gösterilmez.
VISIBILITY_PRIVATE
ayarını yaptığınızda bildirim içeriğinin belirli ayrıntıları gizleyen alternatif bir sürümünü de sağlayabilirsiniz. Örneğin, bir SMS uygulaması "3 yeni kısa mesajınız var" ifadesini gösteren ancak mesajın içeriğini ve gönderenleri gizleyen bir bildirim görüntüleyebilir. Bu alternatif bildirimi sağlamak için önce her zamanki gibi NotificationCompat.Builder
ile alternatif bildirimi oluşturun. Ardından, setPublicVersion()
ile normal bildirime alternatif bildirimi ekleyin.
Bildirimlerinin kilit ekranında görünüp görünmeyeceğinin her zaman nihai kontrolünde olduğunu ve uygulamanızın bildirim kanallarına göre bunları kontrol edebileceğini unutmayın.
Bildirim güncelleme
Bir bildirimi yayınladıktan sonra güncellemek için, daha önce kullandığınız kimliği ileterek NotificationManagerCompat.notify()
öğesini tekrar arayın. Önceki bildirim kapatılırsa bunun yerine yeni bir bildirim oluşturulur.
İsteğe bağlı olarak setOnlyAlertOnce()
işlevini çağırarak bildiriminiz, sesli, titreşimli veya görsel ipuçlarıyla kullanıcının dikkatini yalnızca ilk kez göründüğünde kesintiye uğratması için sonraki güncellemeler için bunu aramaz.
Bildirimi kaldırma
Bildirimler, aşağıdakilerden biri gerçekleşene kadar görünür durumda kalır:
- Kullanıcı bildirimi kapatır.
- Bildirimi oluştururken
setAutoCancel()
öğesini ararsanız kullanıcı bildirime dokunur. - Belirli bir bildirim kimliği için
cancel()
yöntemini çağırırsınız. Bu yöntem devam eden bildirimleri de siler. - Daha önce gönderdiğiniz tüm bildirimleri kaldıran
cancelAll()
numarasını çağırıyorsunuz. - Bildirimi oluştururken
setTimeoutAfter()
aracını kullanarak bir zaman aşımı ayarlarsanız belirtilen süre biter. Gerekirse belirtilen zaman aşımı süresi dolmadan bir bildirimi iptal edebilirsiniz.
Mesajlaşma uygulamaları için en iyi uygulamalar
Mesajlaşma ve sohbet uygulamalarınız için bildirim oluştururken, burada listelenen en iyi uygulamaları göz önünde bulundurun.
MessagingStyle'ı kullan
Android 7.0'dan (API düzeyi 24) başlayarak Android, özellikle mesajlaşma içeriği için bir bildirim stili şablonu sağlar. NotificationCompat.MessagingStyle
sınıfını kullanarak ileti dizisi başlığı, ek iletiler ve bildirimin içerik görünümü gibi, bildirimde görüntülenen çeşitli etiketleri değiştirebilirsiniz.
Aşağıdaki kod snippet'i, MessagingStyle
sınıfını kullanarak bir bildirimin stilinin nasıl özelleştirileceğini göstermektedir.
Kotlin
val user = Person.Builder() .setIcon(userIcon) .setName(userName) .build() val notification = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("2 new messages with $sender") .setContentText(subject) .setSmallIcon(R.drawable.new_message) .setStyle(NotificationCompat.MessagingStyle(user) .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson()) .addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson()) ) .build()
Java
Person user = new Person.Builder() .setIcon(userIcon) .setName(userName) .build(); Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("2 new messages with " + sender) .setContentText(subject) .setSmallIcon(R.drawable.new_message) .setStyle(new NotificationCompat.MessagingStyle(user) .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson()) .addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson()) ) .build();
Android 9.0 (API düzeyi 28) sürümünden başlayarak, bildirimin ve avatarlarının en iyi şekilde oluşturulmasını sağlamak için Person
sınıfının da kullanılması gerekir.
NotificationCompat.MessagingStyle
kullanırken aşağıdakileri yapın:
- İkiden fazla kişinin katıldığı grup sohbetleri için bir başlık belirlemek üzere
MessagingStyle.setConversationTitle()
numaralı telefonu arayın. Grup sohbetinin adı veya adı yoksa görüşmedeki katılımcıların listesi iyi bir görüşme başlığı olabilir. Aksi takdirde, mesaj, görüşmedeki en son mesajı gönderen kişiyle yapılan bire bir görüşmenin ait olduğu düşünülebilir. - Resim gibi medya mesajlarını eklemek için
MessagingStyle.setData()
yöntemini kullanın. Resim/* kalıbının MIME türleri desteklenir.
Doğrudan Yanıt özelliğini kullan
Doğrudan Yanıt, kullanıcının bir iletiye satır içi yanıt göndermesine olanak tanır.
- Bir kullanıcı satır içi yanıt işlemiyle yanıt verdikten sonra,
MessagingStyle
bildirimini güncellemek içinMessagingStyle.addMessage()
seçeneğini kullanın ve bildirimi geri çekmeyin veya iptal etmeyin. Bildirimin iptal edilmemesi, kullanıcının bildirimden birden fazla yanıt göndermesine olanak tanır. - Satır içi yanıt işlemini Wear OS ile uyumlu hale getirmek için
Action.WearableExtender.setHintDisplayInlineAction(true)
numaralı telefonu arayın. - Bildirime eski mesajlar ekleyerek doğrudan yanıt odaklı bir görüşmeyle ilgili bağlam sağlamak için
addHistoricMessage()
yöntemini kullanın.
Akıllı Yanıt'ı etkinleştir
- Akıllı Yanıt özelliğini etkinleştirmek için yanıtlama işleminde
setAllowGeneratedResponses(true)
numarasını arayın. Bu sayede, bildirim Wear OS cihaza köprülendiğinde kullanıcılar Akıllı Yanıt yanıtlarını görebilir. Akıllı Yanıt yanıtları,NotificationCompat.MessagingStyle
bildirimiyle sağlanan bağlam kullanılarak tamamen saat üzerinde çalışan bir makine öğrenimi modeli tarafından oluşturulur ve yanıtları oluşturmak için internete herhangi bir veri yüklenmez.
Bildirim meta verileri ekleme
- Cihaz
Do Not Disturb mode
dayken sisteme uygulama bildirimlerinizi nasıl ele alacağını bildirmek için bildirim meta verileri atayın. Örneğin, Rahatsız Etmeyin modunu geçersiz kılmak içinaddPerson()
veyasetCategory(Notification.CATEGORY_MESSAGE)
yöntemini kullanın.