Check out what’s new from Firebase at Google I/O 2022. Learn more

Bir Android uygulamasında mesaj alın

Firebase bildirimleri, alıcı uygulamanın ön plan/arka plan durumuna bağlı olarak farklı davranır. Ön plana alınan 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ı işleme

İletileri almak için FirebaseMessagingService genişleten bir hizmet kullanın. Hizmetiniz onMessageReceived ve onDeletedMessages geri aramalarını geçersiz kılmalıdır. Herhangi bir mesajı aldıktan sonra 20 saniye içinde (Android Marshmallow'da 10 saniye) işlemelidir. Zaman penceresi, onMessageReceived çağırmadan önce meydana gelen işletim sistemi gecikmelerine bağlı olarak daha kısa olabilir. Bu süreden sonra, Android O'nun arka planda yürütme sınırları gibi çeşitli işletim sistemi davranışları, işinizi tamamlama yeteneğinizi etkileyebilir. Daha fazla bilgi için mesaj önceliğine genel bakışımıza bakın.

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

  • Uygulamanız arka plandayken gönderilen bildirim mesajları . Bu durumda bildirim, cihazın sistem tepsisine iletilir. Bir bildirime dokunan kullanıcı, 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 teslim edilir.

Özetle:

Uygulama durumu Bildirim Veri İkisi birden
ön plan onMessageReceived onMessageReceived onMessageReceived
Arka fon Sistem tepsisi onMessageReceived Bildirim: sistem tepsisi
Veri: niyetin 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ğ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 bu 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, aşağıdakiler için özel varsayılan simgeyi görüntüler:

  • Bildirim oluşturucusundan gönderilen tüm bildirim mesajları.
  • Simgeyi bildirim yükünde açıkça ayarlamayan herhangi bir bildirim mesajı.

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

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

Herhangi bir özel varsayılan simge ayarlanmadıysa ve bildirim yükünde hiçbir simge ayarlanmadıysa, Android, uygulama simgesini beyaz olarak görüntüler.

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:

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

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}")

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

Silinmiş Mesajları Geçersiz onDeletedMessages

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

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

Uygulamanız arka plandayken Android, bildirim mesajlarını sistem tepsisine yönlendirir. Bildirime dokunan bir kullanıcı, varsayılan olarak uygulama başlatıcıyı açar.

Bu, hem bildirim hem de veri yükünü (ve Bildirimler konsolundan gönderilen tüm mesajları) içeren 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 teslim edilir.

Uygulamanıza ileti teslimine ilişkin bilgi için, Android uygulamaları için "gösterimler" (kullanıcılar tarafından görülen bildirimler) verileriyle birlikte Apple ve Android cihazlarda gönderilen ve açılan iletilerin sayısını kaydeden FCM raporlama panosuna bakın.

Arka Plan Kısıtlı Uygulamalar (Android P veya daha yenisi)

FCM, kullanıcı tarafından arka plan kısıtlamasına tabi tutulan uygulamalara mesaj iletemez (örneğin: Ayar -> Uygulamalar ve Bildirim -> [uygulama adı] -> Pil yoluyla). Uygulamanız arka plan kısıtlamasından kaldırıldığında, uygulamaya yeni mesajlar daha önce olduğu gibi teslim edilecektir. Kayıp mesajları ve diğer arka plan kısıtlama etkilerini önlemek için, Android vitals çabası tarafından listelenen kötü davranışlardan kaçındığınızdan emin olun. Bu davranışlar, Android cihazının kullanıcıya uygulamanızın arka planda kısıtlanmasını önermesine neden olabilir. Uygulamanız, arka planda kısıtlı olup olmadığını şu şekilde kontrol edebilir: isBackgroundRestricted() .

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

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

Bu kullanım senaryosunu oluştururken, doğrudan önyükleme modu için genel en iyi uygulamaları ve kısıtlamaları gözlemleyin. Doğrudan önyükleme özellikli iletilerin 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, doğrudan önyükleme modu için ayarlanmalıdır.
  • Cihazda Google Play hizmetlerinin son bir sürümü yüklü olmalıdır (19.0.54 veya üzeri).
  • Uygulamanın FCM mesajlarını alabilmesi için FCM SDK'sını ( com.google.firebase:firebase-messaging ) kullanması 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" özniteliğini ekleyerek uygulamanın FirebaseMessagingService doğrudan önyüklemesini haberdar edin:

    <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.
  • Services , doğrudan önyükleme modunda çalışırken, Activity , BroadcastReceivers veya doğrudan önyükleme farkında olarak işaretlenmemiş diğer Activities gibi bileşenleri kullanmaya çalışmamalıdır.
  • Hizmetin kullandığı kitaplıklar ayrıca, doğrudan önyükleme modunda çalışırken, kimlik bilgileri korumalı depolamaya erişmemeli veya directBootAware olmayan bileşenleri çağırmamalıdır. Bu, uygulamanın kullandığı ve hizmetten çağrılan kitaplıkların ya doğrudan önyüklemenin farkında olması gerekeceği ya da uygulamanın doğrudan önyükleme modunda çalışıp çalışmadığını kontrol etmesi ve onları bu modda çağırmaması gerektiği anlamına gelir. Örneğin, Firebase SDK'ları doğrudan önyükleme ile çalışır (bir uygulamaya doğrudan önyükleme modunda çökmeden dahil edilebilirler), ancak birçok Firebase API'si doğrudan önyükleme modunda çağrılmayı desteklemez.
  • Uygulama özel bir Application kullanıyorsa, Application ayrıca doğrudan önyüklemenin farkında olması gerekir (doğrudan önyükleme modunda kimlik bilgileri korumalı depolamaya erişim yok).

Aygıtlara doğrudan önyükleme modunda mesaj gönderme konusunda rehberlik için, bkz. Doğrudan önyükleme etkin mesajları gönderme .