Mesajları Android uygulamasında alın

Firebase bildirimleri, ön plana/arka plana bağlı olarak farklı davranır durumu hakkında daha fazla bilgi edinin. Ön planda görüntülenen uygulamaların veya veri mesajlarını işleyebilir. Böyle bir durumda, onMessageReceived geri çağırması. Bildirim ve veri mesajları arasındaki farkın açıklaması için Mesaj türleri başlıklı makaleyi inceleyin.

Mesajları işleme

Mesajları almak için FirebaseMessagingService değerleridir. Hizmetiniz onMessageReceived ve onDeletedMessages koşullarını geçersiz kılmalıdır daha fazla bilgi edindiniz.

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. Sonrasında, Android'in işlem öldürme veya Android O'nun arka planda yürütme sınırları işlerinizi tamamlamanızı engelleyebilir.

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

  • Uygulamanız arka plandayken teslim edilecek 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 bkz. Bildirimler ve veri mesajları için de geçerlidir.

Uygulama manifestini düzenleyin

FirebaseMessagingService uygulamasını kullanmak için aşağıdakileri sayfanıza eklemeniz gerekir: uygulama manifesti:

<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 application etiketine aşağıdaki satırları 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, aşağıdakiler için özel varsayılan simgeyi gösterir:

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

  • Bildirim derleyici'den gönderilen tüm bildirim mesajları.
  • Bildirimdeki rengi açık bir şekilde ayarlamayan tüm bildirim iletileri yük.

Özel bir varsayılan simge ayarlanmazsa ve bildirim yükünde herhangi bir simge ayarlanmamışsa Android'de uygulama simgesi beyaz renkte görüntülenir.

onMessageReceived öğesini geçersiz kılma

FirebaseMessagingService.onMessageReceived yöntemini geçersiz kılarak alınan iletişim bilgilerine göre RemoteMessage nesnesini tanımlayın ve mesaj verilerini alın:

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ıl

Bazı durumlarda FCM bir mesaj yayınlamayabilir. 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ğlanmadığında 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 söz konusu cihazdaki uygulamaya mesaj göndermediyseniz FCM, onDeletedMessages()'u aramaz.

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

Uygulamanız arka plandayken Android, bildirim mesajlarını sistem tepsisine yönlendirir. Kullanıcı bildirime dokunduğunda uygulama başlatıcıyı açan kişi: varsayılandır.

Buna, hem bildirim hem de veriler içeren mesajlar dahildir yük (ve Notifications konsolundan gönderilen tüm mesajlar). Bu gibi durumlarda bildirim, cihazın sistem tepsisine gönderilir ve veri yükü, başlatıcı etkinliğinizin intent'inin ekstralarında gönderilir.

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

Şu tarihten önce uygulamalara FCM mesajları göndermek isteyen geliştiriciler: cihazın kilidi açıldığında, cihaz şu anda Android uygulamasının mesaj almasını sağlayabilir. doğrudan başlatma modunda. Ö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. İnsanların doğrudan başlatmanın etkin olduğu görünürlüğün göz önünde bulundurulması özellikle önemlidir mesajlar; cihaza erişimi olan tüm kullanıcılar bu mesajları olmadan görüntüleyebilir Kullanıcı kimlik bilgilerini girerek.

Ön koşullar

  • Cihaz doğrudan başlatma moduna uygun şekilde ayarlanmalıdır.
  • Cihazda Google Play Hizmetleri'nin yeni bir sürümü (19.0.54 veya üzeri) yüklü olmalıdır.
  • Uygulamanın, FCM mesajları almak için FCM SDK'sını (com.google.firebase:firebase-messaging) kullanması gerekir.

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

  1. Uygulama düzeyindeki Gradle dosyasına FCM doğrudan önyükleme destek kitaplığına 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 cihazının doğrudan başlatma modunda çalışabildiğinden emin olmanız önemlidir. Kontrol et :

  • 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ığı hiçbir kitaplık, aynı zamanda kimlik bilgileriyle korunan depolama alanına veya doğrudan başlatma modunda çalışırken Direct BootAware olmayan bileşenleri çağırır. Yani, kitaplıklar hizmetten çağrılan uygulama kullanımları, doğrudan başlatmaya duyarlı olmalıdır veya uygulamanın doğrudan başlatma modunda çalışıp çalışmadığını kontrol etmesi ve kullanıcıları bu modda çağırmaması gerekir. Örneğin, Firebase SDK'ları doğrudan başlatma ile çalışır ( doğrudan başlatma modunda kilitleniyorsa), ancak birçok Firebase API'si doğrudan çağrılmayı desteklemez açın.
  • 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 başlatma modundaki cihazlara mesaj gönderme hakkında yardım için bkz. Doğrudan başlatma özellikli mesajlar gönderin.