Mesajları Android uygulamasında alın

Firebase bildirimleri, alıcı uygulamanın ön planda/arka planda durumuna bağlı olarak farklı şekilde davranır. Ön plana alınmış uygulamaların bildirim iletileri veya veri iletileri almasını istiyorsanız onMessageReceived geri çağırmasını işlemek için kod yazmanız gerekir. Bildirim ve veri mesajları arasındaki farkın açıklaması için Mesaj türleri başlıklı makaleyi inceleyin.

İletileri işleme

İleti almak için FirebaseMessagingService hizmetini genişleten bir hizmet kullanın. Hizmetiniz, onMessageReceived ve onDeletedMessages geri çağırmalarını geçersiz kılmalıdır.

Bir iletinin işlenme süresi, onMessageReceived çağrısından önce oluşan gecikmelere (işletim sistemi gecikmeleri, uygulamanın başlatılma 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) 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ırları gibi çeşitli işletim sistemi davranışları, işinizi 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 edilen bildirim iletileri. 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 amacının 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: Amaç 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 manifestinize 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 uygulanan özel bir varsayılan simge ve özel bir varsayılan renk belirtebilirsiniz.

Özel varsayılan simgeyi ve özel rengi ayarlamak için bu satırları application etiketi 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, aşağıdaki öğeler için özel varsayılan simgeyi gösterir:

  • Bildirim oluşturucu'dan gönderilen tüm bildirim mesajları.
  • Bildirim yükünde simgeyi açıkça ayarlamayan tüm bildirim mesajları.

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

  • Bildirim oluşturucu'dan gönderilen tüm bildirim mesajları.
  • Bildirim yükünde rengi açıkça ayarlamayan tüm bildirim mesajları.

Özel bir varsayılan simge ayarlanmamışsa ve bildirim yükünde simge ayarlanmamışsa Android, beyaz olarak oluşturulmuş uygulama simgesini gösterir.

Geçersiz kıl: onMessageReceived

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

Kotlin

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.
}

Geçersiz kıl: onDeletedMessages

Bazı durumlarda FCM mesaj göndermeyebilir. Bu durum, belirli bir cihazda uygulamanız için çok fazla mesaj (>100) bekliyorsa veya cihaz bir aydan uzun süredir FCM'ya bağlanmadıysa meydana gelir. Bu durumlarda, FirebaseMessagingService.onDeletedMessages() için 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()'ı aramaz.

Arka plana alınmış 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ı varsayılan olarak açılır.

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

Uygulamanıza mesaj teslimiyle ilgili analizler için FCM raporlama kontrol paneline bakın. Bu kontrol paneli, Apple ve Android cihazlarda gönderilen ve açılan mesajların sayısını kaydeder. Ayrıca Android uygulamaları için "gösterim" (kullanıcılar tarafından görülen bildirimler) verilerini de içerir.

Doğrudan başlatma modunda FCM mesajları alma

Cihazın kilidi açılmadan önce bile uygulamalara FCM mesajları göndermek isteyen geliştiriciler, cihaz doğrudan başlatma modundayken Android uygulamasının mesaj almasını sağlayabilir. Örneğin, uygulamanızın kullanıcılarının kilitli cihazlarda bile alarm bildirimleri almasını isteyebilirsiniz.

Bu kullanım alanını oluştururken genel doğrudan başlatma modu en iyi uygulamalarına ve kısıtlamalarına uyun. Doğrudan başlatma özelliği etkinleştirilmiş mesajların görünürlüğünü göz önünde bulundurmak özellikle önemlidir. Cihaza erişimi olan tüm kullanıcılar, kullanıcı kimlik bilgilerini girmeden bu mesajları görüntüleyebilir.

Ön koşullar

  • Cihaz, doğrudan başlatma modu için ayarlanmış olmalıdır.
  • Cihazda Google Play Hizmetleri'nin yeni bir sürümü (19.0.54 veya sonraki sürümler) yüklü olmalıdır.
  • Uygulama, FCM mesajlarını almak için FCM SDK'sını (com.google.firebase:firebase-messaging) kullanmalıdır.

Uygulamanızda doğrudan başlatma modu mesaj işleme özelliğini etkinleştirme

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

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Uygulama manifestine android:directBootAware="true" özelliğini ekleyerek uygulamanın FirebaseMessagingService doğrudan başlatma işlemine duyarlı 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 öğesinin doğrudan başlatma modunda çalışabildiğinden emin olmanız önemlidir. Aşağıdaki koşulları karşıladığınızdan emin olun:

  • Hizmet, doğrudan başlatma modunda çalışırken kimlik bilgileriyle korunan depolama alanına erişmemelidir.
  • Hizmet, doğrudan başlatma modunda çalışırken doğrudan başlatmaya uygun olarak işaretlenmemiş Activities, BroadcastReceivers gibi bileşenleri veya diğer Services kullanmaya çalışmamalıdır.
  • Hizmetin kullandığı tüm kitaplıklar, kimlik bilgileriyle korunan depolama alanına erişmemeli ve doğrudan başlatma modunda çalışırken doğrudan başlatmaya uygun olmayan bileşenleri çağırmamalıdır. Bu nedenle, uygulamanın kullandığı ve hizmetten çağrılan tüm kitaplıkların doğrudan başlatma işlemine uygun olması veya uygulamanın doğrudan başlatma modunda çalışıp çalışmadığını kontrol etmesi ve bu modda kitaplıkları çağırmaması gerekir. Örneğin, Firebase SDK'ları doğrudan başlatma ile çalışır (doğrudan başlatma modunda uygulamayı kilitlenmeden uygulamaya dahil edilebilir), ancak birçok Firebase API'si doğrudan başlatma modunda çağrılmayı desteklemez.
  • Uygulama özel bir Application kullanıyorsa Application da doğrudan başlatma işlemine duyarlı olmalıdır (doğrudan başlatma modunda kimlik bilgisiyle korunan depolamaya erişim yoktur).

Doğrudan başlatma modundaki cihazlara mesaj gönderme hakkında bilgi edinmek için Doğrudan başlatma özelliği etkinleştirilmiş mesajlar gönderme başlıklı makaleyi inceleyin.