Bir Android uygulamasında mesaj alma

Firebase bildirimleri, alıcı uygulamanın ön plan/arka plan durumuna bağlı olarak farklı davranır. Ön plandaki uygulamaların bildirim mesajları veya veri mesajları almasını istiyorsanız onMessageReceived geri aramasını işlemek için kod yazmanız gerekir. Bildirim ve veri mesajları arasındaki farkın açıklaması için bkz. Mesaj türleri .

Mesajları yönetme

Mesaj almak için FirebaseMessagingService kapsamını genişleten bir hizmet kullanın. Hizmetiniz onMessageReceived ve onDeletedMessages geri aramalarını geçersiz kılmalıdır.

Bir iletinin işlenmesi için zaman penceresi, 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 dahil olmak üzere, onMessageReceived çağrılmadan önce oluşan gecikmelere bağlı olarak 20 saniyeden kısa olabilir. Bu sürenin sonunda, Android'in işlem sonlandırması veya Android O'nun arka planda yürütme sınırları gibi çeşitli işletim sistemi davranışları, çalışmanızı tamamlama yeteneğinizi etkileyebilir.

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

  • Uygulamanız arka planda olduğunda gönderilen bildirim mesajları . Bu durumda bildirim cihazın sistem tepsisine iletilir. Kullanıcının bir bildirime dokunması varsayılan olarak uygulama başlatıcıyı açar.

  • Arka planda alındığında hem bildirim hem de veri yükü içeren mesajlar . Bu durumda, bildirim cihazın sistem tepsisine iletilir ve veri yükü, başlatıcı Etkinliğinizin amacının ekstralarında iletilir.

Özetle:

Uygulama durumu Bildiri Veri İkisi birden
Ön plan onMessageReceived onMessageReceived onMessageReceived
Arka plan Sistem tepsisi onMessageReceived Bildirim: sistem tepsisi
Veri: amacın ekstralarında.
Mesaj türleri hakkında daha fazla bilgi için bkz. Bildirimler ve veri mesajları .

Uygulama bildirimini düzenleyin

FirebaseMessagingService kullanmak için uygulama bildiriminize 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ğerleri ayarlamanız önerilir. Bildirim verisinde 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 etiketinin içine şu 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örüntüler:

  • Bildirimler oluşturucusundan gönderilen tüm bildirim iletileri.
  • Bildirim yükündeki simgeyi açıkça ayarlamayan herhangi bir bildirim mesajı.

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

  • Bildirimler oluşturucusundan gönderilen tüm bildirim iletileri.
  • Bildirim yükünün rengini açıkça ayarlamayan herhangi bir bildirim mesajı.

Özel bir varsayılan simge ayarlanmamışsa ve bildirim yükünde hiçbir simge ayarlanmamışsa Android, uygulama simgesini beyaz renkte görüntüler.

Alınan onMessageReceived Geçersiz Kıl

FirebaseMessagingService.onMessageReceived yöntemini geçersiz kılarak, alınan RemoteMessage nesnesine dayalı eylemler gerçekleştirebilir 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 Geçersiz Kıl

Bazı durumlarda FCM mesaj iletmeyebilir. Bu durum, bağlandığı sırada belirli bir cihazda uygulamanız için bekleyen çok fazla mesaj (>100) olduğunda veya cihaz bir aydan uzun bir süredir FCM'ye bağlanmadığında meydana gelir. Bu durumlarda FirebaseMessagingService.onDeletedMessages() 'a bir geri arama alabilirsiniz. Uygulama örneği bu geri aramayı aldığında, uygulama sunucunuzla tam senkronizasyon gerçekleştirmelidir. Son 4 hafta içinde söz konusu cihazdaki uygulamaya mesaj göndermediyseniz FCM, onDeletedMessages() çağırmaz.

Arka plandaki bir uygulamada bildirim mesajlarını işleme

Uygulamanız arka planda olduğunda Android, bildirim mesajlarını sistem tepsisine yönlendirir. Kullanıcının bildirime dokunması varsayılan olarak uygulama başlatıcıyı açar.

Bu, hem bildirim hem de veri yükünü içeren mesajları (ve Bildirimler konsolundan gönderilen tüm mesajları) içerir. Bu durumlarda, bildirim cihazın sistem tepsisine iletilir ve veri yükü, başlatıcı Etkinliğinizin amacının ekstralarında iletilir.

Uygulamanıza mesaj teslimine ilişkin bilgi edinmek için Apple ve Android cihazlarda gönderilen ve açılan mesajların sayısını ve Android uygulamalarına ilişkin "gösterimler" (kullanıcılar tarafından görülen bildirimler) verilerini kaydeden FCM raporlama kontrol paneline bakın.

Doğrudan önyükleme modunda FCM mesajlarını alın

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

Bu kullanım örneğini oluştururken, doğrudan önyükleme moduna yönelik genel en iyi uygulamaları ve kısıtlamaları gözlemleyin. Doğrudan önyüklemenin etkin olduğu mesajların görünürlüğünü dikkate almak özellikle önemlidir; cihaza erişimi olan herhangi bir kullanıcı, kullanıcı kimlik bilgilerini girmeden bu mesajları görüntüleyebilir.

Önkoşullar

  • Aygıtın doğrudan önyükleme moduna ayarlanması gerekir.
  • Cihazda Google Play hizmetlerinin güncel bir sürümü (19.0.54 veya üzeri) yüklü olmalıdır.
  • 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 önyükleme modu mesaj işlemeyi etkinleştirin

  1. Uygulama düzeyindeki Gradle dosyasında, FCM doğrudan önyükleme destek kitaplığına bir bağımlılık ekleyin:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Uygulama bildirimine android:directBootAware="true" özelliğini ekleyerek uygulamanın FirebaseMessagingService doğrudan önyüklemesini etkinleştirin:

    <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 doğrudan önyükleme modunda çalışabilmesini sağlamak önemlidir. Aşağıdaki gereksinimleri kontrol edin:

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

Doğrudan önyükleme modunda aygıtlara mesaj gönderme konusunda rehberlik için bkz. Doğrudan önyükleme özellikli mesajları gönderme .