Mesajları Android uygulamasında alın

Firebase bildirimleri, alıcı uygulamanın ön plan/arka plan durumuna bağlı olarak farklı şekilde çalışır. Ön plandaki uygulamaların bildirim mesajları veya veri mesajları almasını istiyorsanız onMessageReceived geri çağırma işlevini işleyen kod yazmanız gerekir. Bildirim ve veri mesajları arasındaki farkın açıklanması için Mesaj türleri başlıklı makaleyi inceleyin.

Mesajları işleme

Mesaj almak için FirebaseMessagingService uzantısı olan bir hizmet kullanın. Hizmetiniz onMessageReceived ve onDeletedMessages geri çağırmalarını geçersiz kılmalıdır.

Bir iletiyi işleme süresi, işletim sistemi gecikmeleri, uygulama başlatma süresi, ana iş parçacığının diğer işlemler tarafından engellenmesi veya önceki onMessageReceived çağrılarının çok uzun sürmesi gibi onMessageReceived çağrısı öncesinde yaşanan gecikmelere bağlı olarak 20 saniyeden kısa olabilir. Bu sürenin ardından Android'in işlem sonlandırma veya Android O'nun arka planda yürütme sınırlamaları gibi çeşitli işletim sistemi davranışları, çalışmanızı tamamlamanızı engelleyebilir.

onMessageReceived, aşağıdaki istisnalar dışında çoğu ileti türü için sağlanır:

  • Uygulamanız arka plandayken gönderilen bildirim mesajları. Bu durumda bildirim, cihazın sistem tepsisine gönderilir. Kullanıcı bir bildirime dokunduğunda varsayılan olarak uygulama başlatıcı açılır.

  • Arka planda alındığında hem bildirim hem de veri yükü içeren mesajlar. Bu durumda bildirim, cihazın sistem tepsisine gönderilir ve veri yükü, başlatıcı etkinliğinizin intent'inin ekstralarında gönderilir.

Özet olarak:

Uygulama durumu Bildirim Veriler İkisi de
Ön plan onMessageReceived onMessageReceived onMessageReceived
Arka plan Sistem tepsisi onMessageReceived Bildirim: sistem tepsisi
Veriler: intent'in ekstralarında.
Mesaj türleri hakkında daha fazla bilgi için Bildirimler ve veri mesajları başlıklı makaleyi inceleyin.

Uygulama manifestini düzenleme

FirebaseMessagingService özelliğini kullanmak için uygulama manifest dosyanıza aşağıdakileri eklemeniz gerekir:

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Ayrıca, bildirimlerin görünümünü özelleştirmek için varsayılan değerler ayarlamanız önerilir. Bildirim yükünde eşdeğer değerler ayarlanmadığında uygulanacak özel bir varsayılan simge ve özel bir varsayılan renk belirtebilirsiniz.

Özel varsayılan simgeyi ve özel rengi ayarlamak için aşağıdaki satırları application etiketinin içine ekleyin:

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

Android, şunun için özel varsayılan simgeyi görüntüler:

  • Bildirim oluşturucudan gönderilen tüm bildirim mesajları.
  • Bildirim yükünde simgeyi açıkça belirtmeyen tüm bildirim mesajları.

Android, aşağıdakiler için özel varsayılan rengi kullanır:

  • Bildirim derleyici'den gönderilen tüm bildirim mesajları.
  • Bildirim yükünde rengi açıkça ayarlamayan tüm bildirim mesajları.

Özel varsayılan simge ayarlanmamışsa ve bildirim yükü içinde simge ayarlanmamışsa Android, uygulama simgesini beyaz olarak gösterir.

onMessageReceived ayarını geçersiz kıl

FirebaseMessagingService.onMessageReceived yöntemini geçersiz kılarak, alınan RemoteMessage nesnesine göre işlemler yapabilir ve mesaj verilerini alabilirsiniz:

Kotlin+KTX

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: ${remoteMessage.from}")

    // Check if message contains a data payload.
    if (remoteMessage.data.isNotEmpty()) {
        Log.d(TAG, "Message data payload: ${remoteMessage.data}")

        // Check if data needs to be processed by long running job
        if (needsToBeScheduled()) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Java

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

onDeletedMessages öğesini geçersiz kılma

Bazı durumlarda FCM mesaj teslim etmeyebilir. Bu durum, belirli bir cihazda uygulamanız için bağlanma sırasında bekleyen çok fazla mesaj (>100) olduğunda veya cihaz bir aydan uzun süredir FCM'e bağlı değilse ortaya çıkar. Bu durumlarda, FirebaseMessagingService.onDeletedMessages() için geri çağırma alabilirsiniz. Uygulama örneği bu geri çağırmayı aldığında uygulama sunucunuzla tam senkronizasyon gerçekleştirmelidir. Son 4 hafta içinde bu cihazdaki uygulamaya mesaj göndermediyseniz FCM, onDeletedMessages() uygulamasını aramaz.

Arka planda çalışan bir uygulamada bildirim mesajlarını işleme

Android, uygulamanız arka plandayken bildirim mesajlarını sistem tepsisine yönlendirir. Kullanıcı bildirime dokunduğunda varsayılan olarak uygulama başlatıcı açılır.

Hem bildirim hem de veri yükü içeren mesajlar (ve Bildirimler Konsolu'ndan gönderilen tüm mesajlar) buna dahildir. Bu gibi durumlarda bildirim, cihazın sistem tepsisine, veri yükü ise başlatıcı etkinliğinizin intent'inin ekstralarında yayınlanır.

Uygulamanıza mesaj yayınlama hakkında bilgi edinmek için FCMraporlama kontrol paneline bakın. Bu panelde, Apple ve Android cihazlarda gönderilen ve açılan mesajların sayısı ile Android uygulamaları için "gösterim" (kullanıcı tarafından görüntülenen bildirimler) verilerinin yanı sıra diğer bilgiler yer alır.

Doğrudan önyükleme modunda FCM mesajları alma

Cihazın kilidi açılmadan önce bile uygulamalara FCM mesajları göndermek isteyen geliştiriciler, Android uygulamasının cihaz doğrudan önyükleme modundayken mesaj almasını etkinleştirebilir. Örneğin, uygulamanızın kullanıcılarının kilitli bir cihazda bile alarm bildirimi almasını isteyebilirsiniz.

Bu kullanım alanını oluştururken doğrudan önyükleme modu için genel en iyi uygulamalara ve kısıtlamalara uyun. Doğrudan önyükleme özelliği etkinleştirilmiş iletilerin görünürlük durumunu dikkate almak özellikle önemlidir. Cihaz erişimi olan tüm kullanıcılar, kullanıcı kimlik bilgilerini girmeden bu iletileri görüntüleyebilir.

Ön koşullar

  • Cihaz, doğrudan önyükleme modu için ayarlanmalıdır.
  • Cihazınızda Google Play Hizmetleri'nin son sürümünün (19.0.54 veya sonraki sürümler) yüklü olması gerekir.
  • Uygulamanın FCM mesajlarını alabilmesi için FCM SDK'sını (com.google.firebase:firebase-messaging) kullanıyor olması gerekir.

Uygulamanızda doğrudan başlatma modu ile mesaj işlemeyi etkinleştirin

  1. Uygulama düzeyindeki Gradle dosyasına FCM doğrudan başlatma desteği kitaplığına bir bağımlılık ekleyin:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Uygulama manifest dosyasına android:directBootAware="true" özelliğini ekleyerek uygulamanın FirebaseMessagingService doğrudan önyükleme farkında olmasını sağlayın:

    <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false"
        android:directBootAware="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    

Bu FirebaseMessagingService'ın doğrudan önyükleme modunda çalışabildiğinden emin olmanız önemlidir. Aşağıdaki koşulları kontrol edin:

  • Hizmet, doğrudan önyükleme modunda çalışırken kimlik bilgisi korumalı depolamaya erişmemelidir.
  • Hizmet, doğrudan önyükleme modunda çalışırken doğrudan önyükleme bilinir olarak işaretlenmemiş Activities, BroadcastReceivers veya diğer Services gibi bileşenleri kullanmaya çalışmamalıdır.
  • Hizmetin kullandığı tüm kitaplıklar da doğrudan önyükleme modunda çalışırken kimlik bilgisi korumalı depolamaya erişmemeli veya directBootAware olmayan bileşenleri çağırmamalıdır. Bu, uygulamanın hizmetten çağrılan ve kullandığı kitaplıkların doğrudan önyükleme bilincine sahip olması veya uygulamanın doğrudan önyükleme modunda çalışıp çalışmadığını kontrol etmesi ve bu modda kitaplıkları çağırmaması gerektiği anlamına gelir. Örneğin, Firebase SDK'ları doğrudan önyükleme ile çalışır (doğrudan önyükleme modunda uygulamayı kilitlemeden uygulamaya dahil edilebilirler), ancak birçok Firebase API'si doğrudan önyükleme modunda çağrılmayı desteklemez.
  • Uygulama özel bir Application kullanıyorsa Application'ün doğrudan önyükleme bilincine sahip olması da gerekir (doğrudan önyükleme modunda kimlik bilgisi korumalı depolamaya erişim yoktur).

Doğrudan önyükleme modundaki cihazlara mesaj göndermeyle ilgili yardım için Doğrudan önyükleme modunda mesaj gönderme başlıklı makaleyi inceleyin.