2017-01-12 2 views
2

Ich habe eine App, die Firebase verwendet.Firebase onDisconnected aufgerufen beim Schließen der App durch Wischen es

Die Datensätze der Firebase enthalten ein "Status" -Feld, das Informationen geben soll, wenn der Benutzer offline oder online ist.

ich initialisieren es wie folgt aus:

fireBase = new Firebase("https://myProj.firebaseio.com/users"); 
child = fireBase.child(MyApp.myStringIdentifier); 
child.child("status").setValue(ClientStatus.ONLINE); 
child.child("status").onDisconnect().setValue(ClientStatus.OFFLINE); 

Die Initialisierung funktioniert gut, und die onDisconnect() wird auch nach viel Zeit gibt es keine Internet-Verbindung und Feuerbasis hat den Status ändern, wie zu erwarten sind offline.

Das Problem ist, dass das Ereignis onDisconnect auch aufgerufen wird, wenn der Benutzer die App aus der Liste der letzten Apps auswischt, aber ich will, dass der Benutzer online bleibt, da ich noch im Hintergrund laufende Dienste hatte, die einige behandeln sollten Ereignisse, selbst wenn die App geschlossen ist (Sie werden zwar weiterhin ausgeführt, andere Benutzer erhalten jedoch den Offline-Status des schließenden Benutzers und anschließend werden die Aktionen für diesen Benutzer blockiert).

Gibt es eine Möglichkeit zu verhindern, dass onDisconnect Ereignis aufgerufen wird, wenn der Benutzer die App ausliest?

Antwort

2

Die onDisconnect Handler Ihrer Firebase Datenbank-Client genannt:

  1. , wenn die Datenbank-Client trennt aktiv aus dem Firebase Server
  2. , wenn der Server feststellt, dass der Datenbank-Client (durch das Socket-Verbindung Timing verschwunden out)

Beachten Sie, dass keiner von diesen etwas mit Ihrem Anwendungs-Lebenszyklus zu tun hat, das, was Sie interessiert sind zu sein scheint.

Wenn Sie die Datenbank ändern möchten, wenn Ihre Anwendung zerstört wird, sollten Sie die Anwendungslebenszyklusereignisse wahrscheinlich unter detect when the application exits abhören.

+0

Ich brauche einen Weg, um den Unterschied zwischen wissen Trennung wegen Grund 1 oder Grund 2 von dem, was du geschrieben hast. Mit Grund 2 gehe ich davon aus, dass der Benutzer überhaupt keine Internetverbindung hat, aber mit Grund 1 möchte ich annehmen, dass die App getötet wurde, aber es gibt noch Dienste, die das können eingehende Ereignisse behandeln –

+0

Ist es möglich, den Grund zu kennen (1 oder 2 von dem, was Sie geschrieben haben), warum das Ereignis onDisconnect aufgerufen wurde? –

+0

Es gibt keine Möglichkeit zu wissen, ob das Ereignis disconnect für eine aktive Trennung oder eine Zeitüberschreitung auf dem Socket ausgelöst wird. Sie können sich darauf verlassen, dass der Client nicht verbunden war. –

2

Wenn der Benutzer eines Android-Geräts die Übersichtsanzeige verwendet, um eine App "wegzuwischen", ist das ein Signal, dass sie die App nicht mehr verwenden möchten, und sie sind nicht daran interessiert, zu ihr zurückzukehren Zeit bald. Android wird den App-Prozess beenden. Wenn Sie den App-Prozess beenden, wird die Verbindung zu Ihrer Echtzeitdatenbank geschlossen. Durch das Schließen der Verbindung wird onDisconnect() auf dem Server ausgeführt. Sie haben keine Kontrolle über diesen Prozess, wenn der Benutzer seine Entscheidung trifft. Dies ist ein Design der Android-Plattform, die es dem Benutzer ermöglicht, die endgültige Entscheidung darüber zu treffen, was tatsächlich auf seinem Gerät ausgeführt werden kann. Als App-Entwickler sind Sie nicht befugt, Ihre eigene Entscheidung zu erzwingen.

Wenn Sie die App eine Nachricht selbst senden wollen, obwohl sie vom Benutzer getötet worden sind, können Sie stattdessen Firebase Cloud Messaging verwenden, um Ereignisse zu liefern, die der Benutzer Interesse bekundet hat.

+0

Das Problem besteht nicht darin, eine Nachricht zu senden, sondern anderen Benutzern mitzuteilen, dass Sie online sind.Jeder Client erhält von fire base wiederholt den Status aller anderen Clients und glaubt dann, dass der wegwischende Benutzer offline ist, obwohl er Services hat, die Ereignisse von ihm verarbeiten können. –

+0

Sie können stattdessen eine neue Frage über die Implementierung Ihrer spezifischen Anforderungen stellen, was es für einen Benutzer bedeutet, "online" zu sein, in welcher Form auch immer Sie dies definieren (es ist mir nicht klar, und Android definiert dies auch nicht). Wenn Sie versuchen, es in Bezug auf die Netzwerkkonnektivität des Geräts zu definieren, wird Ihre App nicht wirklich davon auf neueren Geräten abhängen können. Ihr App-Prozess kann nicht ständig ausgeführt werden. –

Verwandte Themen