Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Bir Android uygulamasında mesaj alın

Firebase bildirimleri, alan uygulamanın ön plan / arka plan durumuna bağlı olarak farklı davranır. Ön planlı uygulamaların bildirim mesajları veya veri mesajları almasını istiyorsanız, onMessageReceived geri aramayı 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

FirebaseMessagingService genişleten bir hizmet kullanın. Hizmetiniz onMessageReceived ve onDeletedMessages geri aramalarını geçersiz onDeletedMessages . Herhangi bir mesajı aldıktan sonra 20 saniye içinde işlemelidir (Android Marshmallow'da 10 saniye). Zaman penceresi, onMessageReceived çağrılmadan önce ortaya çıkan işletim sistemi gecikmelerine bağlı olarak daha kısa olabilir. Bu sürenin sonunda, Android O'nun arka plan yürütme sınırları gibi çeşitli işletim sistemi davranışları, çalışmanızı 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 ileti türü için sağlanır:

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

Özetle:

Uygulama durumu Bildirim Veri Her ikisi de
Ön plan onMessageReceived onMessageReceived onMessageReceived
Arka fon Sistem tepsisi onMessageReceived Bildirim: sistem tepsisi
Veriler: 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 aşağıdakileri uygulama manifestinize 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 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 için özel varsayılan simgeyi görüntüler

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

Android, özel varsayılan rengi kullanır

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

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

onMessageReceived geçersiz kıl

Yöntem geçersiz kılarak FirebaseMessagingService.onMessageReceived , alınan dayalı eylemleri gerçekleştirebilirsiniz RemoteMessage nesne ve mesaj verilerini almak:

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

onDeletedMessages geçersiz onDeletedMessages

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

Arka planda çalışan bir uygulamada bildirim mesajlarını yönetin

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

Bu, hem bildirim hem de veri yükü 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 niyetinin ekstralarında teslim edilir.

Uygulamanıza mesaj teslimi hakkında bilgi edinmek için, iOS ve Android cihazlarda gönderilen ve açılan mesajların sayısının yanı sıra Android uygulamaları için "gösterimler" (kullanıcılar tarafından görülen bildirimler) verilerini kaydeden FCM raporlama panosuna bakın.

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

FCM, kullanıcı tarafından arka planda kısıtlama getirilen uygulamalara mesajlar göndermeyebilir (örneğin: Ayar -> Uygulamalar ve Bildirim -> [uygulama adı] -> Pil aracılığıyla). 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 tarafından listelenen kötü davranışlardan kaçının. Bu davranışlar, Android cihazının kullanıcıya uygulamanızın arka planda kısıtlanmasını önermesine neden olabilir. Uygulamanız, isBackgroundRestricted () kullanarak arka planda kısıtlanmış olup olmadığını kontrol edebilir.

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

Cihazın kilidi açılmadan önce FCM mesajlarını uygulamalara göndermek isteyen geliştiriciler, cihaz doğrudan önyükleme modundayken bir Android uygulamasının 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öz önünde bulundurun. Doğrudan önyükleme özellikli 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

  • Cihaz, doğrudan önyükleme moduna ayarlanmalıdır.
  • Cihazda Google Play hizmetlerinin en son sürümü yüklü olmalıdır (19.0.54 veya üzeri).
  • Uygulama, FCM mesajlarını almak için FCM SDK ( com.google.firebase:firebase-messaging ) kullanıyor olmalıdır.

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 manifestine android:directBootAware="true" özelliğini ekleyerek uygulamanın FirebaseMessagingService doğrudan önyüklemesinin farkında olun:

    <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ışabileceğinden emin olmak ö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 gibi bileşenleri veya doğrudan önyükleme duyarlı olarak işaretlenmemiş diğer Services kullanmaya çalışmamalıdır.
  • Hizmetin kullandığı hiçbir kitaplık, 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 doğrudan önyüklemeden haberdar olması gerektiği veya uygulamanın doğrudan önyükleme modunda çalışıp çalışmadığını kontrol etmesi ve bu modda çağırmaması gerektiği anlamına gelir. Örneğin, Firebase SDK'ları doğrudan önyükleme ile çalışır (doğrudan önyükleme modunda çökmeden bir uygulamaya dahil edilebilirler), ancak birçok Firebase API'si doğrudan önyükleme modunda çağrılmayı desteklemez.
  • Application özel bir Application kullanıyorsa, Application ayrıca doğrudan önyüklemeye duyarlı olması gerekir (doğrudan önyükleme modunda kimlik bilgileri korumalı depolamaya erişim yok).

Doğrudan önyükleme modunda cihazlara mesaj gönderme konusunda rehberlik için bkz. Doğrudan önyükleme etkin mesajlar gönderme .