FB onMessageReceived nicht aufgerufen, wenn app in hintergrund
Ich arbeite mit FB und testen das senden von Benachrichtigungen an die app von meinem server, während die app im hintergrund. Ist die Benachrichtigung erfolgreich gesendet, es scheint sogar auf die Mitteilungszentrale des Geräts, aber wenn die Meldung erscheint, oder sogar wenn ich drauf klicke, wird die Methode onMessageReceived in meinem FCMessagingService wird nie aufgerufen.
Wenn ich getestet, während meine app war im Vordergrund, die onMessageReceived-Methode aufgerufen wurde und alles gut ging. Das problem tritt auf, wenn die app im hintergrund ausgeführt wird.
Ist das beabsichtigtes Verhalten, oder gibt es eine Möglichkeit, kann ich dieses Problem beheben?
Hier ist mein FBMessagingService:
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class FBMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.i("PVL", "MESSAGE RECEIVED!!");
if (remoteMessage.getNotification().getBody() != null) {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getNotification().getBody());
} else {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getData().get("message"));
}
}
}
Was meinst du den json-body der Benachrichtigung? Auch meine onTokenRefresh code ist in meinem FirebaseInstanceID service.
Kannst du die Beispiel-Nutzlast, die Sie senden?
istudy.io/android-push-Benachrichtigungen-über-FB-fcm
Sie können auch prüfen, ob dieser thread stackoverflow.com/questions/39046270/...
InformationsquelleAutor Cyogenos | 2016-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese wie vorgesehen funktioniert, wird die notification-Nachrichten werden an Ihre onMessageReceived callback nur, wenn die app im Vordergrund. Wenn Ihre app im hintergrund oder geschlossen ist, dann wird eine Benachrichtigungsmeldung angezeigt, in der notification center, und alle Daten aus, dass die Nachricht übergeben wird, die Absicht, die gestartet wird, als ein Ergebnis der Benutzer durch Tippen auf die Benachrichtigung.
Können Sie eine click_action zu zeigen die Absicht, die gestartet werden soll, wenn die Benachrichtigung der Benutzer darauf tippt. Die Haupt-Aktivität verwendet wird, wenn keine click_action angegeben ist.
Wenn die Absicht gestartet wird, können Sie die
abrufen einer Gruppe umfassen würden alle Daten, die gesendet werden zusammen mit der Benachrichtigung.
Mehr zur Benachrichtigungsmeldung finden Sie unter docs.
click_action
wenn ich mit der FB Benachrichtigung Konsole?ok, aber was ist, wenn die app getötet wird (keine Vorder-oder hintergrund)?
Sie können testen Sie selbst. Senden Sie eine Nachricht, während die app nicht ausgeführt wird. Die Nachricht sollte noch geliefert werden, um das Ziel-Handy.
Aber so deaktivieren Sie Benutzer-Benachrichtigung verwerfen? Denn wenn Benutzer, es zu verwerfen, es bedeutet, dass alle Daten überspringen... Richtig?
Richtig!!!! Also, wenn das senden von Benachrichtigungen an Android, die begleitenden Daten sollten die Daten, die die Verbesserung der Benachrichtigungs-Erfahrung. Es sollte nicht sein, die app wichtige Daten, verwenden Sie Daten-Nachrichten für die Daten, die die Anwendung braucht, selbst wenn der Benutzer schließt die Benachrichtigung.
InformationsquelleAutor Arthur Thompson
Entfernen
notification
Feld vollständig von Ihrem server anfordern. Senden nurdata
und behandeln es inonMessageReceived()
sonst IhreonMessageReceived()
wird nicht ausgelöst, wenn die app im hintergrund läuft oder getötet.Nicht vergessen
"priority": "high"
Feld in der Benachrichtigung anfordern. Gemäß der Dokumentation: Daten-Nachrichten gesendet werden, mit der Priorität "normal", also Sie kommen nicht sofort; es könnte auch das problem sein.Hier ist, was ich bin, das versenden vom server
So erhalten Sie Ihre Daten in
onMessageReceived(RemoteMessage message)
wie diese....lassen Sie uns sagen, ich habe, um idDies war die Lösung für mich, um Nachrichten zu empfangen im hintergrund!
In Oreo, wenn die app getötet, onMessageReceived ist nicht immer genannt. ich habe nur die Nutzlast mit den Daten nur. jedem update haben Sie ?
Funktioniert wie ein Charme!
Lieben Sie alot für die Antwort :p
InformationsquelleAutor Zohab Ali
diese Methode handleIntent() wurde abgeschrieben, so dass die Handhabung einer Benachrichtigung kann getan werden, als unten:
Vordergrund Stand: Der Klick auf die Benachrichtigung geht an die angemeldete Absicht, die Aktivität, die Sie während der Erstellung einer Meldung der pro-grammatisch wie es in der Regel erstellt mit Daten Nutzlast der Benachrichtigung.
Hintergrund/Getötet Staat - das system selbst schafft einen Meldung auf Grundlage notification payload und klicken Sie auf Benachrichtigung, dass Sie zu den launcher-Aktivität der Anwendung, wo man leicht abrufen Absicht, Daten in Ihren life-cycle-Methoden.
wirklich die perfekte Lösung!
Ich bin Umgang mit der Benachrichtigung Anzeige-Logik in handleIntent(Vorsatz, Absicht) , aber wenn die app im hintergrund, 2 Benachrichtigungen angezeigt werden , eine, die ich erstellt habe und andere standardmäßig enthält die gesamte Nachricht in Benachrichtigung.
Genial, aber ich sehe keine Verwendung für
OnMessageReceived
in diesem Fall !?Ich bin com.google.FB:FB-messaging:11.6.2 & handleIntent ist Letzte nun.Check stackoverflow.com/questions/47308155/...
InformationsquelleAutor manas.abrol
Ich hatte das gleiche problem. Es ist einfacher zu verwenden, die 'Nachricht' anstelle der 'Benachrichtigung'. Die Daten-Nachricht immer die Klasse laden, onMessageReceived.
In diesem Kurs können Sie Ihre eigenen Benachrichtigung mit den notificationbuilder.
Beispiel:
es funktioniert nur, wenn app ist im Vordergrund, nicht wenn es im hintergrund. helfen u kann mir auslösen, dieses Ereignis in beiden Fällen??
wie sieht Ihr POST auf der FB-server aussieht?
Es gibt eigentlich nur drei mögliche Fälle hier. 1) App im Vordergrund. 2) App im hintergrund. 3) die App wird nicht ausgeführt. Wie Sie sagen, eine "data" - Nachricht empfangen werden, in den ersten beiden Fällen, aber nicht im Dritten Fall, wenn die app nicht läuft. Gerecht zu werden für alle drei Fälle, die Sie brauchen, um die "Benachrichtigung" - Feld in der Nachricht. (Auch eine gute Idee, wenn Sie möchten, unterstützt iOS-als auch Android-clients)
Auch in der app nicht läuft, ich stil bekommen eine Nachricht vom server auf die Funktion onmessagereceived. Ich Stimme mit Ihnen überein, dass es besser ist, "Benachrichtigung", wenn Sie möchten, eine ios-Version zu.
InformationsquelleAutor Koot
Hier gibt es mehr klare Konzepte über FB-Nachricht. Ich fand es von Ihrem support-team.
FB hat drei message-Typen:
Benachrichtigungen : Benachrichtigung funktioniert auf den hintergrund oder den Vordergrund. Wenn app ist im hintergrund-Benachrichtigungen geliefert werden, die system-tray. Wenn die app im Vordergrund ist, die Nachrichten werden behandelt, indem
onMessageReceived()
oderdidReceiveRemoteNotification
Rückrufe. Dies sind im wesentlichen die so genannten Display-Meldungen.Daten-Nachrichten: Auf Android-Plattform, Daten-Nachricht arbeiten können hintergrund-und Vordergrund. Die Daten-Nachricht wird von onMessageReceived(). Eine Plattform-spezifische note wäre hier: Auf Android, die Daten-Nutzlast kann abgerufen werden in der Absicht verwendet, um starten Sie Ihre Aktivität. Zu erarbeiten, wenn Sie
"click_action":"launch_Activity_1"
können Sie abrufen, diese Absicht durchgetIntent()
von nurActivity_1
.Nachrichten mit beiden Benachrichtigungs-und Daten-payloads: Wenn im hintergrund apps erhalten die Nutzdaten der Benachrichtigung in der notification tray, und verarbeiten nur die Daten -, payload ' wenn der Benutzer tippt auf die Benachrichtigung. Wenn Sie im Vordergrund ist, erhält Ihre app ein message-Objekt mit beiden Nutzlasten zur Verfügung. Zweitens, die click_action parameter wird Häufig verwendet, in notification payload und nicht im Daten -, payload'. Wenn im Daten -, payload, dieser parameter würde behandelt werden als benutzerdefinierte Schlüssel-Wert-paar, und deshalb würden Sie brauchen, zu implementieren benutzerdefinierte Logik für Sie zu arbeiten, wie beabsichtigt.
Außerdem empfehle ich Ihnen, verwenden Sie Methode onMessageReceived (siehe Daten-Nachricht) zum extrahieren der Daten-bundle. Aus deiner Logik, ich habe das bundle-Objekt und nicht das gefunden haben, erwartet Daten. Hier ist ein Verweis auf einen ähnlichen Fall, der vielleicht mehr Klarheit.
Für mehr info besuchen Sie meine dieser thread und dieser thread
InformationsquelleAutor Md. Sajedul Karim
Als pro FB Cloud-Messaging-Dokumentation,-Wenn Tätigkeit im Vordergrund, dann onMessageReceived wird aufgerufen. Wenn die Aktivität im hintergrund läuft oder geschlossen ist, dann Benachrichtigung angezeigt wird im notification center für app-launcher-Aktivität.
Rufen Sie Ihre individuelle Tätigkeit, die auf klicken auf die Benachrichtigung, wenn die app im hintergrund läuft, durch Aufruf der rest-service-api für FB-messaging:
URL-https://fcm.googleapis.com/fcm/send
Methode Typ - POST
Körper/Nutzlast:
Und mit diesem in Ihrer app hinzuzufügen, können Sie folgenden code in der activity aufgerufen wird:
Überprüfen Sie dies: firebase.google.com/docs/cloud-messaging/...
InformationsquelleAutor Ankit Adlakha
Wenn app ist im hintergrund-Modus oder inaktiv(getötet), und Sie klicken Sie auf auf Benachrichtigung, sollten Sie prüfen, die für die Nutzlast in LaunchScreen(in meinem Fall Start-Bildschirm ist MainActivity.java).
So, in MainActivity.java auf onCreate check für Extras:
Danke, das ist die Antwort. @Md.Tarikul Islam mit onMessageReceived() wie bereits erwähnt in dieser Frage.
InformationsquelleAutor Gent Berani
Ich hab das gleiche Problem. Wenn die app in Vordergrund - es löst mein hintergrund-Dienst, wo kann ich update meine Datenbank auf der Grundlage der Meldungsart.
Aber die app geht in den hintergrund - die Standard-notification-service wird gesorgt sein, um zu zeigen, die eine Benachrichtigung an den Benutzer.
Hier ist meine Lösung zu identifizieren, die app im hintergrund und lösen Ihre hintergrund-Dienst,
In der manifest.xml
Getestet, die Lösung in der neuesten android-version 8.0. Dank
wo wird dieser code public class FirebaseBackgroundService erstreckt WakefulBroadcastReceiver @Nagendra Badiganti
erstellen Sie eine service-Klasse in Ihr Paket und registrieren Sie in Ihrem manifest.xml. Stellen Sie sicher, dass Sie die filter für Ihre Benachrichtigungen. Da die service-Trigger für jede GCM notification.
firebase.google.com/docs/cloud-messaging/android/... ich bin diesem link folgt, muss ich diese Klasse hinzu Benachrichtigung erhalten . nur senden Nachricht von der Feuerstellung erste Nachricht.. es sagt abgeschlossen, aber keine Benachrichtigung erhalten, @Nagendra Badiganti
haben Sie fügen Sie google-services.json in Ihrem Projekt-root-Ordner?
InformationsquelleAutor Nagendra Badiganti
Überschreiben der
handleIntent
Methode derFirebaseMessageService
für mich funktioniert.hier der code in C# (Xamarin)
- und das ist der Code in Java
Wie kann ich die aufrufen die handleIntent Funktion?
Die Methode wird aufgerufen, wenn Sie die Meldung von der Feuerstellung, aber Sie können nicht außer Kraft gesetzt, weil die Methode deklariert ist endgültig. (FB 11.6.0)
Dies funktioniert in 11.4.2
InformationsquelleAutor t3h Exi
Standardmäßig die Launcher Aktivität in Sie app gestartet wird, wenn die app im hintergrund und Sie auf die Benachrichtigung klicken, wenn Sie alle Daten mit Ihrem notifcation Sie behandeln können es in der gleichen Aktivität wie folgt vor,
getIntent().getExtras() immer null ist,haben Sie keine andere Lösung ?Bei der app wird bacground Methode onMessageReceived nicht nennen
InformationsquelleAutor Uzair
Wenn app ist im hintergrund Feuer-Basis von Standard-handling-Benachrichtigung, Aber wenn wir wollen, dass unsere benutzerdefinierte Benachrichtigung als wir unseren server-Seite, die verantwortlich ist für senden, unsere benutzerdefinierte Daten(data payload)
Benachrichtigung entfernen Nutzlast vollständig von Ihrem server anfordern. Schicken Sie nur Daten und verarbeiten es in onMessageReceived() andernfalls wird Ihr onMessageReceived wird nicht ausgelöst, wenn die app im hintergrund läuft oder getötet.
nun,Ihre server-side-code-format Aussehen,
HINWEIS: siehe diese Zeile im obigen code
"text": "John Doe gemeinsamen Kontakt in der Gruppe-Kontakt-Austausch"
in Daten -, payload, die Sie verwenden sollten "text" - parameter anstelle von "body" oder "message" Parameter für Beschreibung Nachricht oder was auch immer Sie text verwenden möchten.
onMessageReceived()
InformationsquelleAutor Hiren
Rufen Sie diese in Ihrem MainActivity die onCreate-Methode :
InformationsquelleAutor Shekhar
gemäß der Lösung von t3h Exi ich möchte nach den clean code hier. Legen Sie Sie einfach in MyFirebaseMessagingService und alles funktioniert gut, wenn die app im hintergrund-Modus. Sie müssen mindestens zu kompilieren com.google.FB:FB-messaging:10.2.1
Ja, aber das ist nicht meine Schuld, oder aus irgendeinem anderen Grund zu geben, -1 !!! Sehr arrogant. Es funktioniert, bis FB 11.4.2 dann google verändert es (aus dieser Methode final). So, jetzt müssen Sie Programmieren Sie Ihre eigene Lösung mit der Benachrichtigung.
Ich nicht -1 sondern +1 !
Sie sparen mein job 😛
InformationsquelleAutor Frank
Versuchen Sie dies:
InformationsquelleAutor user3587828
Ich hatte dieses Thema(app nicht öffnen wollen, auf die Benachrichtigung klicken, wenn app im hintergrund läuft oder geschlossen), und das problem war eine ungültige
click_action
im notification Körper, versuchen Sie, entfernen oder ändern Sie ihn auf etwas, gültig.InformationsquelleAutor Octavian Lari
Ich hatte das gleiche Problem und habe etwas mehr Graben. Wenn die app im hintergrund, ein Benachrichtigung an die Taskleiste, ABER ein Daten-Nachricht geschickt
onMessageReceived()
Sehen https://firebase.google.com/docs/cloud-messaging/downstream#monitor-token-generation_3
und https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java
Um sicherzustellen, dass die Nachricht, die Sie senden, die docs sagen, "Verwenden Sie Ihre app-server und FCM-server-API: Legen Sie die Daten-Taste nur. Kann entweder zusammenklappbar oder nicht-klappbar."
Sehen https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
InformationsquelleAutor Eric B.
Den Punkt und verdient eine Hervorhebung, die Sie verwenden Daten-Nachricht - Daten key nur - um onMessageReceived handler aufgerufen, auch wenn die app im hintergrund läuft. Es sollte keine andere Benachrichtigung Schlüssel in Ihrer Nutzlast, ansonsten wird der handler nicht ausgelöst, wenn die app im hintergrund läuft.
Wird erwähnt (aber nicht so betont FCM-Dokumentation) hier:
https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
InformationsquelleAutor n_y
Backend, mit dem ich arbeite ist mit Benachrichtigungen und nicht Nachrichten. Also nach Lesen aller Antworten habe ich versucht abzurufen, die extras, die das bundle mit der Absicht, dass kommt auf die gestartete Aktivität.
Aber egal, welche Tasten ich habe versucht, abrufen von
getIntent().getExtras();
, war der Wert immer null.Allerdings habe ich endlich einen Weg gefunden, Daten zu senden, mit Benachrichtigungen und rufen Sie es aus der Absicht.
Ist dabei der Schlüssel zum hinzufügen von Daten Nutzlast, um die Benachrichtigung anzuzeigen.
Beispiel:
Nachdem Sie dies tun, werden Sie in der Lage sein, um erhalten Sie Ihre Informationen in dieser Weise:
intent.getExtras().getString("title")
wird
message_title
und
intent.getExtras().getString("message")
wird
message_body
Referenz
InformationsquelleAutor Vito Valov
Wenn Ihr problem zeigt Großes Bild, d.h. wenn Sie das senden von push-Benachrichtigungen mit einem Bild aus der Feuerstellung der Konsole und es zeigt das Bild nur, wenn die app im Vordergrund. Die Lösung für dieses problem ist das senden einer push-Nachricht mit nur-Daten-Feld. So etwas wie dieses:
InformationsquelleAutor Arun
Es gibt zwei Arten von Nachrichten: Benachrichtigungen und Nachrichten.
Wenn Sie nur Daten senden-Nachricht, die ohne notification-Objekt in Ihre Nachricht ein string. Es würde aufgerufen werden wenn die app im hintergrund.
InformationsquelleAutor Shongsu
Wenn die Nachricht empfangen wird und die app im hintergrund die Benachrichtigung gesendet wird, um die extras Absicht der Haupttätigkeit.
Können Sie den zusätzlichen Wert in der oncreate () - oder onresume () - Funktion von der Haupt-Aktivität.
Können Sie die Felder wie Daten, Tabelle etc. ( die man in der Meldung angegeben)
Beispiel: ich schickte die Daten als Schlüssel
InformationsquelleAutor Sanjeev S
Gibt es 2 Arten von FB push-Benachrichtigungen:
1 - Benachrichtigung(Display-Meldung) ->
-- 1.1 Wenn Sie diese Variante auswählen, wird das OS erstellen Sie selbst eine Benachrichtigung, wenn app ist im Hintergrund und übergeben Sie die Daten in die
intent
. Dann ist es an der client zum verarbeiten dieser Daten.-- 1.2 Wenn die app in Vordergrund dann die Meldung es empfangen wird, über
callback-function
imFirebaseMessagingService
und es an den client zu behandeln.2 - Daten-Nachrichten(bis zu 4k-Daten) -> Diese Meldungen werden verwendet, um senden nur Daten an den client(im hintergrund) und es an den client zu behandeln, ist es für beide Fälle, hintergrund/Vordergrund-per callback-Funktion in
FirebaseMessagingService
Dies ist laut offiziellen docs:https://firebase.google.com/docs/cloud-messaging/concept-options
InformationsquelleAutor Balflear
Einfach überschreiben Sie die OnCreate-Methode der FirebaseMessagingService. Es wird aufgerufen, wenn die app im hintergrund:
Können Sie mir erklären, was Sie tun, Sie nicht verstehen? die angegebene Methode muss eingefügt in den code, ist Teil der Frage voll beantwortet die Frage. Der code ist für Xamarin, aber Sie können einfach konvertieren in java.
AFAIK Die offizielle Dokumentation (firebase.google.com/docs/cloud-messaging/android/client) nicht zu reden überschreiben OnCreate in einer service-Erweiterung FirebaseMessagingService - wenn Sie Zugriff auf die Dokumentation, die funktioniert, vielleicht können Sie teilen sich ein link? Auch aus deiner Antwort, es ist nicht klar, wie das überschreiben onCreate löst das problem der onMessageReceived nicht immer aufgerufen, wenn die Benachrichtigung geklickt wird - daher die bitte um mehr Informationen.
Die Dokumentation erwähnt nicht das überschreiben der OnCreate-Methode, aber es funktioniert, denn ich bin mit es in der Produktion. Der code, den Sie einfügen möchten, in dem Methode onMessageReceived und die offensichtlich dient dazu einige hintergrund-Operationen durchgeführt werden können OnCreate.
In diesem Fall erarbeiten, auf die Tatsache, dass es irgendwie für Sie gearbeitet werden kann, beweisen die mehr hilfreich als nur die Auflistung der Lösung. Auch undokumentierte Verhalten ist wahrscheinlich willkürlich aufhören zu arbeiten, mit updates, und jemand, der Sie hat, um vorbereitet zu sein, überarbeiten Ihren code, wenn es funktioniert. Dieser Haftungsausschluss gestellt werden muss.
InformationsquelleAutor Renzo Ciot