42

だから...私はAndroid用のアプリケーションを作っています。アプリケーションはリアルタイムチャットデータを送受信する必要があります(ソケットである必要があります)が、コマンドも送信する必要があります(クライアントが何かを送信しているときにそれを認識しているわけではありません)。

ユーザーのバッテリーを節約するという点で、より良い解決策は何かを知る必要があります。

a)コマンドが送信されるたびに接続を開いたり閉じたりします。チャットタブが開いている場合は、接続を一定に保ちます。

b)接続を常に一定に保ちます。

私はインターネットを調べましたが、答えはまちまちです。持続的接続を維持することはバッテリーの寿命に悪いと言う人もいれば、そうではないと言う人もいます(例:「TCP接続を開いたままにするとバッテリーが消耗するかどうか尋ねていますか? -人生?たぶん私はここから離れているかもしれませんが、接続を開いたままにしておくとバッテリーの寿命が無駄になることはありません...あなたがその情報をどこで入手したか知りたいと思うなら。それは私にはとても奇妙に聞こえます。」

または、より良い別の解決策がある場合。このような状況でも、GoogleのC2DMはまったく役に立たないと思います。

基本的に、バッテリーをさらに消耗させるのは何ですか?永続的な接続があるか、チャットタブが開いていない限り接続を開いたり閉じたりしますか?

ありがとう!

4

3 に答える 3

66

アイドル状態のTCPソケット接続を開いたままにする(データを送受信しない)と、閉じた状態よりも多くのバッテリーを消費することはありません(または少なくともそうすべきではありません)。これは、アイドル状態のTCP接続が帯域幅やCPUサイクル(*)を使用しないためです。

とはいえ、TCP接続はスリープ状態になるコンピューターとうまく相互作用しないため、TCP接続を長期間開いたままにしておくことはモバイルデバイスにとって適切なオプションではない可能性があります。問題のシナリオは次のとおりです。Androidユーザーがアプリの実行中にAndroidデバイスをスリープ状態にしてから、リモートユーザーのプログラム(またはTCP接続のもう一方の端にあるもの)がTCPストリームを介してデータを送信します。リモートユーザーのプログラムは、AndroidデバイスからACKを取得することはありません。もちろん、Androidデバイスはスリープ状態であるため、リモートデバイスのTCPスタックは、送信したTCPパケットが失われたと見なし、タイムアウト期間を長くして応答します。 TCPウィンドウサイズ(別名、TCPパケットの数を一度に許可)を減らし、TCPパケットを再送信します。しかし、Androidデバイスはまだスリープ状態であるため、同じことが再び発生します。結果として、数分後、TCP接続のリモートエンドが遅くなり、Androidデバイスがウェイクアップしたとしても、TCP接続が遅すぎて使用できなくなる可能性があります。プログラムは、行き詰まったTCP接続を閉じて、とにかく新しい接続を開始する必要があります。それでは、なぜわざわざ開いたままにしようとするのでしょうか。

したがって、私の推奨事項は、デバイスがスリープ状態になるルーチンの一部としてTCP接続を閉じるという条件で、オプション(a)を使用することです。

考えられる注意点の1つは、TCP接続を開いたままにしておくと、WiFiまたはセルネットワークハードウェアがスリープ状態になる可能性がある状況で電源が入ったままになる機能がある場合です。その場合、Androidはデバイスは、アンテナに電力を供給するためのバッテリーコストを支払いますが、それ以外の場合は支払う必要はありませんでした。私はそのようなAndroidロジックを認識していませんが、Androidを少ししか使用していないので、それは私の側の無知かもしれません。少なくとも、テストする価値があるかもしれません。

(*)技術的には、TCPはTCP接続が開いている間、「キープアライブ」パケットを頻繁に送信します。これは、CPUサイクルとアンテナ電力を使用します...しかし、Androidでキープアライブパケットを送信するデフォルトの間隔は2時間です。 、そのために使用される電力が目立つとは思えません。

于 2012-08-03T05:32:03.083 に答える
1

実際に接続を開いたままにしておくには、ハートビート信号を前後に送信する必要があります。Android デバイスとサーバー間のステートフル ルーターは、比較的短いタイムアウト後に接続を忘れてしまうからです。

どちらが優れているかは、サーバーに接続する必要なくどれくらいの期間使用できるかによって異なります。とにかく、ほとんどの場合、30 秒に 1 回程度接続している場合は、必ず接続を開いたままにしておいてください。そうでない場合は、接続を閉じた方がよいでしょう。

于 2012-08-03T05:49:20.780 に答える