0

OS:Android

与えられた:ユーザーは、更新などを受信するためにアプリのサーバーに接続したままにしておきたいと述べています。

目標:アプリがバックグラウンド状態の場合でも、ユーザーがアプリのサーバーに接続できるようにすること。

質問:1つの問題は、ネットワークからの切断が時折発生することです。ユーザーがデータネットワーク接続を失い(2G、3G、WiFiが失われた)、後で接続を回復した場合、アプリは接続されないままになります。私は現在PhoneStateListener、さまざまなネットワークの変更を検出し、必要に応じてサーバーとの接続を再開するために、を利用しようとしています。私のNexusOne(2.1)では、リスナーが最初に登録されたとき以外は呼び出されませんが、後で呼び出されることはonSignalStrengthsChangedありません。onDataConnectionStateChangedリスナーはサービス内に登録されているため、サービスが存続している限り継続的にリッスンします(この質問では、リスナーは「永遠に」と見なすことができます)。他の誰かがデータ接続の状態を聞くことに問題がありましたか?

onServiceStateChangedこれまでで最も信頼できるようですが、他のリスナーでも成功したかどうかを知りたいと思いました。

4

4 に答える 4

2

接続がまだ存在するかどうかを確認するには、キープアライブメッセージを定期的に送信する必要があると思います。そうでない場合は、再確立します。接続が切断される理由はたくさんあり、それらのクライアント側のすべてをチェックすることはできません。

あなたがしていることにグーグルのクラウドサービスを使用することを検討するかもしれません、なぜなら彼らはすでにそのための接続を開いたままにしているからです。そうすれば、ユーザーの電話に、さらに別の接続を維持するオーバーヘッドがなくなります(これは非常に高額になる可能性があります)

于 2011-02-23T10:47:50.597 に答える
2

StackOverflowでは質問を閉じることができないため、PhoneStateListenersが機能しなかった理由を説明します。

私の問題は、リスナーをビット単位で登録しているのではなく、連続して登録していることであることがわかりました(つまり 、(正しい)の代わりに:)
telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
telephonyManager.listen(listener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
.
.
.


telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE..............);

私はこの質問を閉じ、おそらく後で別の質問を開いて、Android上のサーバーへの「常に生きている」接続を維持するための設計提案を求めます。ありがとう。

于 2011-02-23T13:12:55.940 に答える
0

私の知る限り、アプリがバックグラウンドにあるときはリスナーを呼び出すことができませんでした。アクティビティではなくサービスを使用してみてください。

また、TelephonyManagerを適切な方法で取得することを忘れないでください

TelephonyManager mTelephonyMgr = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE); 
于 2011-02-23T10:57:21.927 に答える
0

これにはConnectivityManagerを使用すると思います。

ネットワーク接続の状態に関する質問に答えるクラス。また、ネットワーク接続が変更されたときにアプリケーションに通知します。Context.getSystemService(Context.CONNECTIVITY_SERVICE)を呼び出して、このクラスのインスタンスを取得します。

http://developer.android.com/reference/android/net/ConnectivityManager.html

ドキュメントによると、ネットワーク接続を監視し、変更時にブロードキャストインテントをアプリケーションに送信します。

于 2011-04-22T02:15:57.990 に答える