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ı ile uğraşmak yerine, kullanmak istediğiniz onMessageReceived geri çağırması. Bildirim ve veri mesajları arasındaki farkın açıklaması için Mesaj türleri başlıklı makaleyi inceleyin.

İletileri 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 iletinin işlenmesi için gereken süre, gecikmelere bağlı olarak 20 saniyeden kısa olabilir. onMessageReceived çağrılmadan önce ücretlendirme (OS gecikmeleri, uygulama başlatma süresi, diğer işlemler tarafından engellenen ana iş parçacığı veya önceki onMessageReceived çok uzun sürüyor. 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ğıdakiler dahil çoğu mesaj türü için sağlanır: istisnalar:

  • Uygulamanız arka plandayken teslim edilecek bildirim mesajları Burada durumda, bildirim cihazın sistem tepsisine iletilir. Kullanıcı bir bildirime dokunduğunda 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ü ekstra başlatıcı Etkinliğinizin amacı.

Özet olarak:

Uygulama durumu Bildirim Veriler İkisi de
Ö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ı 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. Siz özel bir varsayılan simge ve her cihazda uygulanan özel bir varsayılan renk eşdeğer değerler bildirim yükünde ayarlanmaz.

Bu satırları, application etiketini kullanarak özel varsayılan simgeyi ve özel rengi ayarlayın:

<!-- 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:

Android,

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

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 mesaj teslim etmeyebilir. Bu durum, aynı anda çok fazla mesaj (>100) için beklemede sırasında veya bağlı değilken belirli bir cihazda uygulamanızı FCM'ye bir aydan uzun bir süre sonra. Böyle durumlarda FirebaseMessagingService.onDeletedMessages() numaralı telefonu arayabilirsiniz Uygulama örneği bu geri çağırmayı aldığında uygulama sunucunuzla tam senkronizasyon gerçekleştirmesi gerekir. Uygulamaya bu konuda mesaj göndermediyseniz cihazı son 4 hafta içinde görürseniz FCM, onDeletedMessages() numaralı telefonu aramayacaktır.

Bildirim mesajlarını arka plandaki bir uygulamada işleme

Android, uygulamanız arka planda çalışırken bildirim mesajlarını şuraya yönlendirir: sistem tepsisini açın. 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 durumlarda, bildirim cihazın veri yükü amaçlanan ekstra şeklinde teslim edilir başlatıcı Etkinliğiniz.

Uygulamanıza mesaj teslimiyle ilgili analizler için bkz. FCM raporlama kontrol paneli, Apple ve Android cihazlarda gönderilen ve açılan iletilerin sayısı "gösterimler" için veriler (kullanıcılar tarafından görülen bildirimler).

FCM mesajlarını doğrudan başlatma modunda al

2023'ten önce bile uygulamalarına 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 cihaz kilitli olsa bile alarm bildirimi alabilir.

Bu kullanım alanını oluştururken, doğrudan başlatma moduna ilişkin en iyi uygulamalar ve kısıtlamalar hakkında daha fazla bilgi edinin. İ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ı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'ine android:directBootAware="true" özelliğini ekleyerek uygulamanın FirebaseMessagingService doğrudan başlatma işlemini fark etmesini 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 başlatma modunda çalışırken kimlik bilgileri korumalı depolama alanına erişmemelidir.
  • Hizmet Activities, BroadcastReceivers, veya doğrudan başlatma modunda çalışırken doğrudan başlatmaya duyarlı olarak işaretlenmemiş diğer Services öğeleri.
  • 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 uygulamasının da doğrudan başlatması gerekir. haberdar (doğrudan başlatma modunda kimlik bilgisi korumalı depolama alanına erişim yok).

Doğrudan başlatma modundaki cihazlara mesaj gönderme hakkında yardım için bkz. Doğrudan başlatma özellikli mesajlar gönderin.