1

サーバーをポーリングする Android アプリを作成したいと考えています。ネットワーク送信を開始すると(現在ネットワークトラフィックがない場合)、余分なバッテリーが必要になると思います。そのため、ネットワーク トラフィックがすでに存在するときにポーリングを行う方が、エネルギー効率が高くなる可能性があります。

私の質問:

  • 「ネットワークトラフィックが発生するまで待機するためにバッテリーを節約する」という私の仮定は正しいですか?
  • ポーリングを行う適切なタイミングが来たことをアンドロイドで確認する方法はありますか?

私がこれまでに知っていること:

ネットワーク ステータスの変更 (wlan/gprs の有効化/無効化) を通知する CONNECTIVITY_CHANGE-broadcastreceiver を登録できます。

        IntentFilter filterc = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"); 
        registerReceiver(ConnectivityCheckReceiver, filterc);

ここに放送受信機があります

public final BroadcastReceiver ConnectivityCheckReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        String type;

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo TestCo = connectivityManager.getActiveNetworkInfo();
        if(TestCo == null)
            isLanConnectedNewValue = false;
        else
            isLanConnectedNewValue = true;

        NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
            type = "Wifi";
        else if(networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
            type = "umts/3g";
        else
            type = "other";

        if(isLanConnectedNewValue & !isLanConnected){
            // good candidate to do polling
        }
        isLanConnected = isLanConnectedNewValue;
    }
};

ネットワークが現在使用されているかどうかを確認する方法はありますか?

4

1 に答える 1

1
  • 「ネットワーク トラフィックが存在するまで待機するためにバッテリーを節約しています」 - セルラー ネットワーク、特に 3G で正しい - これらのネットワークでのデバイスのエネルギー状態 (したがって、消費されたエネルギー) は、ネットワーク トラフィックとネットワーク構成の非アクティブ タイムアウト、および送信量に依存します。大量のエネルギーを消費しながらアイドリングに費やす時間が少なくなります。

より正確には、特定の小さなしきい値 (通常は約 128 バイト) を超えるデータ送信は、デバイスをトリガーしていわゆる DCH 状態 (専用チャンネル) に切り替え、最後のビットが別の 5 ~ 10 秒間送信された後もそこにとどまります。 FACH 状態 (共有チャネル - 待ち時間が長く、スループットが低い) になるまで数秒かかり、さらに 0 ~ 15 秒で IDLE に戻ります。ここでの変動性はランダムではありません。ネットワーク構成とモバイル デバイス (たとえば、Fast Dormancy 1をサポートしているかどうかなど) に依存し、これらはさまざまなネットワークで一般的に見られる値です。これらの両方のタイマーの合計は、各送信後にエネルギーを浪費する時間です。

ちなみに、この専用チャネル状態のラジオは、高エネルギー状態で待機しているだけでも、CPU と同程度の電力を使用します。

  • 「ポーリングを行う適切なタイミングが来たことを Android で確認する方法はありますか?」- 現在のシステムにはありません。巧妙なヒューリスティックを作成することはできますが、システムはそのような情報を報告しないため、本当に良い方法はありません。

実際、エネルギーの観点からポーリングを行うことはほとんど効率的ではありません - 代わりに、低い (!) 周期で維持する長寿命の接続を介して、またはシステムネイティブのプッシュメカニズムを使用して、できる限りプッシュを行うようにしてください。 - 彼らのシステムは非常によく最適化されており、リンクアップのコストは、サービスを使用するすべてのアプリで償却されます。

  • 補足: 特定のネットワークでタイマーを見つけるための API はありません。ただし、本当にそれが必要な場合は、現在のネットワーク シナリオでそれらを推定する非常に簡単な方法は、ping をいじることです: 十分に高い頻度 (たとえば 0.2 秒) で ping を実行すると、3 つの非常に異なる遅延が表示されるはずです。パケット: 2000 ミリ秒をわずかに上回り、次に数百ミリ秒、最後に 60 ~ 80 ミリ秒。2000 ミリ秒を超えると、アイドル状態にあることを意味します。これは、3G リンクをセットアップするためにすべてのシグナリングを行うのにかかる時間です。数百ミリ秒は共有状態 (FACH) にあることを意味し、最低帯域は既に専用の高帯域幅状態 (DCH) にあることを意味します。

これで、ping を使用して推定値を計算するアルゴリズムを理解できるはずですが、送信するのに適した時期であるかどうかを判断するために現在の状態を確認するために ping を使用しないことは明らかです。

編集:

それでも現在のネットワーク トラフィックに関する情報は得られませんが、Android の SyncAdapter を確認することもできます。これにより、同期操作が発生するタイミングをスケジュールするフレームワークを制御できます。

于 2013-07-30T22:24:14.797 に答える