2017-01-12 10 views
2

Firebaseを使用するアプリがあります。アプリを閉じるときにFirebase onDisconnectedが呼び出される

Firebaseのレコードには、ユーザーがオフラインまたはオンラインの場合に情報を提供すると思われる「ステータス」フィールドがあります。

私はそのようにそれを初期化します。

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); 

初期化が正常に動作し、多くの時間インターネットに接続してfirebaseはありませんが、期待通りにオフラインにステータスを変更した後onDisconnect()とも呼ばれます。

最近のアプリリストからアプリをスワイプしたときにも、onDisconnectというイベントが呼び出されますが、バックグラウンドで実行されているサービスがあるため、ユーザーがオンラインにしておきたいという問題があります。 (まだ実行中ですが、他のユーザーが閉鎖ユーザーのオフラインステータスを取得してから、そのユーザーに対するアクションがブロックされます)。

ユーザーがアプリをスワイプしたときにonDisconnectイベントが呼び出されないようにする方法はありますか?あなたのFirebase Databaseクライアントの

答えて

2

onDisconnectハンドラが呼び出されます。

  1. サーバーによりソケット接続タイミングで(データベースクライアントが消滅したことを検出すると、データベース・クライアントは積極的にFirebaseサーバー
  2. から切断したときアウト)

これらのいずれもが興味のあるものをあるように思わアプリケーションのライフサイクル、とは何かを持っていることに注意してください。

アプリケーションが破棄されたときにデータベースを変更する場合は、おそらくアプリケーションライフサイクルイベントをdetect when the application exitsにリッスンする必要があります。

+0

私はとの違いを知るための方法が必要ですあなたが書いたことの理由1または理由2による接続断2の理由ユーザーはインターネット接続を全く持たないと仮定しますが、理由1で私はそのアプリケーションが殺されたと仮定したいと思いますが、着信イベントを処理します。 –

+0

なぜonDisconnectイベントが呼び出されたのか(あなたが書いた1または2の理由)を知ることは可能ですか? –

+0

切断イベントがソケットのアクティブ切断またはタイムアウトに対して発生するかどうかを判断する方法はありません。信頼できるのは、クライアントが切断されたことだけです。 –

2

Android搭載端末のユーザーがオーバービュー表示を使用してアプリを「スワイプアウェイ」すると、アプリを使用したくないとのメッセージが返ってきます間もなくAndroidはアプリのプロセスを終了させます。アプリケーションプロセスを終了すると、リアルタイムデータベースとの接続が切断されます。接続を閉じると、サーバー上でonDisconnect()が実行されます。ユーザーが自分の意思決定をしたとき、このプロセスを制御することはできません。これはAndroidプラットフォームの設計によるもので、ユーザーがデバイス上で実際に実行できるものについて最終的な決定を下すことができます。アプリ開発者として、あなたは自分の判断を強制する権限がありません。

あなたはそれがユーザーによって殺害されていていてもアプリにメッセージを送信したい場合は、代わりにユーザーが関心を表明しているイベントを配信するためにFirebase Cloud Messagingを使用することができます。

+0

問題は、メッセージを送信することではなく、他のユーザーにオンラインであることを知らせることです。すべてのクライアントはfirebaseから他のすべてのクライアントのステータスを繰り返し取得し、スニッフィング離れたユーザーはオフラインであると思っています。 –

+0

代わりに、ユーザーが「オンラインになる」ための具体的な要件の実装について新しい質問をしたいと思うかもしれません。それはあなたが定義した方法で(それは私には分かりませんし、Androidもこれを定義しません)。デバイスのネットワーク接続の観点から定義しようとしている場合、アプリは実際には新しいデバイスのものに依存することはできません。あなたのアプリケーションプロセスは、常に実行することはできません。 –

関連する問題