Bildirimler, uygulamanızdaki etkinlikler hakkında kısa ve zamanında bilgiler sağlar. Bu dokümanda, çeşitli özelliklere sahip bir bildirimi nasıl oluşturacağınız açıklanmaktadır. Bildirimlerin Android'de nasıl göründüğüne dair tanıtım için Bildirimlere genel bakış konusuna bakın. Bildirimleri kullanan örnek kod için GitHub'daki Kişiler örneğine bakın.
Bu sayfadaki kod, AndroidX Kitaplığı'ndaki NotificationCompat
API'lerini kullanır. Bu API'ler yalnızca Android'in yeni sürümlerinde bulunan özellikleri eklemenize olanak tanırken aynı zamanda Android 9'a (API düzeyi 28) uyumluluk sağlamaya devam eder. Ancak satır içi yanıt işlemi gibi bazı özellikler önceki sürümlerde uygulamanın devre dışı bırakılmasına neden olur.
AndroidX Core Kitaplığı'nı ekleme
Android Studio ile oluşturulan çoğu projede NotificationCompat
kullanımı için gerekli bağımlılıklar bulunsa da modül düzeyindeki build.gradle
dosyanızın aşağıdaki bağımlılığı içerdiğini doğrulayın:
Eski
dependencies { implementation "androidx.core:core:2.2.0" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:2.2.0") }
Temel bildirim oluşturma
Daraltılmış biçim olarak da bilinen en temel ve kompakt biçimdeki bir bildirim bir simge, bir 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 etkinlik başlatmak için dokunabileceği bildirimin nasıl oluşturulacağı gösterilmektedir.
Bir bildirimin her bölümü hakkında daha fazla ayrıntı için bildirim anatomisi hakkında bilgi edinin.
Çalışma zamanında istenen izni beyan etme
Android 13 (API düzeyi 33) ve sonraki sürümler, bir uygulamadan muaf olmayan (Ön Plan Hizmeti (FGS) dahil) bildirimleri yayınlamak için çalışma zamanında istenen izni destekler.
Uygulamanızın manifest dosyasında beyan etmeniz gereken izin, şu 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 bildirimin içeriğini ve kanalını NotificationCompat.Builder
nesnesi kullanarak 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, gerekli olan tek 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 rahatsız edici 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
oluşturucusu, bir kanal kimliği sağlamanızı gerektirir. 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 kısaltılır. Genişletilebilir bir bildirim oluşturarak ek bilgiler gösterebilirsiniz.
Bildiriminizin daha uzun olmasını istiyorsanız setStyle()
ile stil şablonu ekleyerek genişletilebilir bildirimi etkinleştirebilirsiniz.
Ö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);
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şturun ve önem verdiğinizi belirleyin
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şturma işlemi hiçbir işlem gerçekleştirmeyeceğinden bu komutu 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 herhangi bir bildirim için kullanıcının nasıl kesintiye uğrayacağını belirler. Önceki örnekte gösterildiği gibi, Android 7.1 ve önceki sürümleri desteklemek için önceliği setPriority()
olarak ayarlayın.
Bildirim önem derecesini veya önceliğini aşağıdaki örnekte gösterildiği gibi ayarlamanız gerekse de sistem, alacağınız uyarının davranışını garanti etmez. Bazı durumlarda sistem, önem düzeyini başka faktörlere bağlı olarak değiştirebilir ve kullanıcı belirli bir kanalın önem düzeyini istediği 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 bilgileri 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 PendingIntent
nesnesiyle tanımlanmış bir içerik amacı belirtin ve bunu setContentIntent()
öğesine iletin.
Aşağıdaki snippet'te, kullanıcı bildirime dokunduğunda bir etkinlik 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 setAutoCancel()
yöntemini çağırır. Bu işlem, kullanıcı dokunduğunda bildirimi otomatik olarak kaldırır.
Yukarıdaki örnekte gösterilen setFlags()
yöntemi, kullanıcının bildirimi kullanarak uygulamanızı açtıktan sonra göstermesi beklenen gezinme deneyimini korur. Başlattığınız etkinliğin türüne bağlı olarak bu özelliği kullanmak isteyebilirsiniz. Bu tür etkinliklerden biri olabilir:
Ö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 gitmesinin bir nedeni yoktur. Dolayısıyla 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 amaç türüdür.
Uygulamanızın normal uygulama akışında bulunan 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öster
Bildirimin görünmesini sağlamak için NotificationManagerCompat.notify()
numaralı telefonu çağırarak bildirim için ve NotificationCompat.Builder.build()
sonucunun benzersiz bir kimliği iletin.
Bu, aşağıdaki örnekte gösterilmektedir:
Kotlin
with(NotificationManagerCompat.from(this)) { if (ActivityCompat.checkSelfPermission( this@MainActivity, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, // grantResults: IntArray) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return@with } // notificationId is a unique int for each notification that you must define. notify(NOTIFICATION_ID, builder.build()) }
Java
with(NotificationManagerCompat.from(this)) { if (ActivityCompat.checkSelfPermission( this@MainActivity, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return } // notificationId is a unique int for each notification that you must define. notify(NOTIFICATION_ID, builder.build()) }
NotificationManagerCompat.notify()
hizmetine ilettiğiniz bildirim kimliğini kaydedin. Bildirimi güncellemek veya kaldırmak istediğinizde bu kimlik gereklidir.
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 ekleyin
Bir bildirimde, kullanıcının hızlı yanıt vermesini sağlayan (örneğin, bir hatırlatıcıyı ertelemek veya bir kısa mesajı yanıtlamak için) üç işlem düğmesi sunulabilir. Ancak bu işlem düğmeleri, kullanıcı bildirime dokunduğunda gerçekleştirilen işlemin kopyasını oluşturmamalıdır.
İşlem düğmesi eklemek için addAction()
yöntemine PendingIntent
iletin. 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 de yapabilirsiniz. Böylece bu işlem, halihazırda açık olan uygulamayı kesintiye uğratmaz.
Örneğin, aşağıdaki kodda bir yayının belirli bir alıcıya nasıl 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ı duraklatmak ve atlamak gibi medya oynatma düğmeleriyle bir bildirim oluşturmaya çalışıyorsanız medya denetimleriyle 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ıtlama işlemi, kullanıcıların bildirime doğrudan metin girmesini sağlar. 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ı yazmayı bitirdiğinde sistem, metin yanıtını bildirim işlemi için belirttiğiniz amaca ekler ve niyeti uygulamanıza gönderir.
Yanıtla düğmesini ekleme
Doğrudan yanıtlamayı 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 tuşu kullanır.Kotlin
// Key for the string that's delivered in the action's intent. private val KEY_TEXT_REPLY = "key_text_reply" var replyLabel: String = resources.getString(R.string.reply_label) var remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run { setLabel(replyLabel) build() }
Java
// Key for the string that's delivered in the action's intent. private static final String KEY_TEXT_REPLY = "key_text_reply"; String replyLabel = getResources().getString(R.string.reply_label); RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) .setLabel(replyLabel) .build();
- 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ı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);
Şekil 4'te gösterildiği gibi, bildirim işlemi tetiklendiğinde sistem kullanıcıdan bir 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 RemoteInput.getResultsFromIntent()
çağrısı yapın ve BroadcastReceiver
tarafından alınan Intent
kodunu 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 etiket (kullanılıyorsa) ile NotificationManagerCompat.notify()
öğesini ç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 aktarılan bağlamı kullanın.
setRemoteInputHistory()
numaralı telefonu arayarak yanıtı bildirimin en altı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ı için en iyi uygulamalar bölümüne bakın.
İlerleme çubuğu ekleyin
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)
çağrısı yaparak göstergenin "belirtilen" biçimini (şekil 5'te gösterildiği gibi) kullanın.
İlk parametre, "complete" değerini ifade eder (ör. 100). İkincisi, ne kadar
tamamlandığı. Sonuncusu, bunun belirli bir ilerleme çubuğu olduğunu gösterir.
İşleminiz devam ederken progress
için güncel bir değerle sürekli olarak setProgress(max, progress,
false)
çağrısı yapı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. İ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)
komutunu çağırın. Sonuç olarak, önceki ilerleme çubuğuyla aynı stilde bir gösterge elde edilir. Ancak bu gösterge, projenin tamamlandığını göstermeyen sürekli bir animasyondur. İlerleme animasyonu, siz setProgress(0, 0, false)
işlevini çağırana kadar çalışır ve ardından etkinlik göstergesini kaldırmak için bildirimi günceller.
İşlemin tamamlandığını belirtmek için bildirim metnini değiştirmeyi unutmayın.
Sistem genelinde bir kategori belirleyin
Android, kullanıcı Rahatsız Etmeyin modunu etkinleştirdiğinde belirli bir bildirimle kullanıcıyı rahatsız edip etmeyeceğini belirlemek için sistem genelinde önceden tanımlanmış kategoriler kullanır.
Bildiriminiz NotificationCompat
içinde tanımlanan bildirim kategorilerinden birine giriyorsa (ör. CATEGORY_ALARM
, CATEGORY_REMINDER
,
CATEGORY_EVENT
veya CATEGORY_CALL
) uygun kategoriyi setCategory()
adresine ileterek bu şekilde beyan edin:
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 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 telefon araması veya çalan alarm gibi acil ve 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ı kilitliyse, kilit ekranını kaplayan tam ekran 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'i, bildiriminizi tam ekran intent'le 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()
öğesini çağırı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 bildirim simgesi ve içerik başlığı gibi temel bilgiler gösterilir. Bildirimin tam içeriği gösterilmez.
VISIBILITY_PRIVATE
ayarladığı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ı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.
Bildirimlerinin kilit ekranında görünüp görünmeyeceğini tamamen kullanıcının kontrol edebileceğini ve bunları uygulamanızın bildirim kanallarına göre kontrol edebileceğini unutmayın.
Bildirimi 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()
aramasını yaparak bildiriminizin kullanıcının ses, titreşim veya görsel ipuçlarıyla yalnızca bildirim ilk göründüğünde kesintiye uğramasını sağlayabilirsiniz. Bu çağrı daha sonraki güncellemeler için geçerli olmaz.
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()
adlı kişiyi ararsanız kullanıcı bildirime dokunur. - Belirli bir bildirim kimliği için
cancel()
numaralı telefonu arayabilirsiniz. Bu yöntem ayrıca devam eden bildirimleri de siler. cancelAll()
numaralı telefonu ararsınız. Bu durumda, daha önce gönderdiğiniz tüm bildirimler kaldırılır.- Bildirimi oluştururken
setTimeoutAfter()
kullanarak zaman aşımı ayarlarsanız belirtilen süre dolar. Gerekirse belirtilen zaman aşımı süresi dolmadan önce 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ı dikkate alın.
MessagingStyle'ı kullanma
Android 7.0 (API düzeyi 24) sürümünden itibaren, Android özel olarak 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ü de dahil olmak üzere 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österir.
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
uygulamasını kullanırken aşağıdakileri yapın:
- İkiden fazla kişinin bulunduğu grup sohbetleri için bir başlık belirlemek üzere
MessagingStyle.setConversationTitle()
numaralı telefonu arayın. İyi bir konuşma başlığı, grup sohbetinin adı veya bir adı yoksa sohbetteki katılımcıların listesi olabilir. Bu olmadan ileti, ileti dizisindeki en son iletiyi gönderen kişiyle bire bir görüşmeye ait olarak algılanabilir. - Resimler gibi medya mesajlarını eklemek için
MessagingStyle.setData()
yöntemini kullanın. Kalıp resminin/* MIME türleri 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
bildirimini güncellemek içinMessagingStyle.addMessage()
öğesini kullanın ve bildirimi geri çekmeyin ya da iptal etmeyin. Bildirimi iptal etmezseniz kullanıcı bildirimden birden fazla yanıt gönderebilir. - 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 geçmiş mesajlar ekleyerek doğrudan yanıt ileti dizisine bağlam sağlamak için
addHistoricMessage()
yöntemini kullanın.
Akıllı Yanıt'ı etkinleştir
- Akıllı Yanıt'ı etkinleştirmek için yanıtlama işleminde
setAllowGeneratedResponses(true)
numaralı telefonu arayın. Bu durum, bildirim bir Wear OS cihaza köprü bağlandığında kullanıcılara Akıllı Yanıt yanıtlarının sunulmasını sağlar. Akıllı Yanıt yanıtları,NotificationCompat.MessagingStyle
bildirimi tarafından sağlanan bağlam kullanılarak tamamen saatteki bir makine öğrenimi modeli tarafından oluşturulur ve yanıt oluşturmak için internete hiçbir veri yüklenmez.
Bildirim meta verileri ekleme
- Cihaz
Do Not Disturb mode
dayken sisteme, uygulama bildirimlerinizi nasıl işleyeceğini belirtmek için bildirim meta verileri atayın. Örneğin, Rahatsız Etmeyin ayarını geçersiz kılmak içinaddPerson()
veyasetCategory(Notification.CATEGORY_MESSAGE)
yöntemini kullanın.