2011-08-08 8 views
0

私のアプリはバックグラウンドでいくつかのサービスを実行しています。彼らは、長寿命のTCP接続、GPS、加速度計、android.os.CountDownTimerを使用します。WakeLockを取り除くことはできますか?

携帯電話がスリープ状態(Android 2.2)になったときにAccelerometerとCountDownTimerが機能するためには、WakeLockが必要であることはすでに知っていますが、GPSはWakeLockを必要としません。

私はまだWakeLockなしで動作すると思うjava.util.TimerでCountDownTimerを置き換えることができますか?その後、定期的な加速度計のチェックのためにWakeLockを取得/解放することができます。 Accelerometerが動きを検出すると、私はGPSをオンにすることができます。 GPS信号がない場合は、タイマーのフルサークルに戻ることができます。

これは恒久的なWakeLockなしで動作しますか?私はTCP接続について知らない。

EDIT: 正確なタイマーを得るためにウォークロックが設定されていないときは、ディープスリープ状態でAlarmManagerを使用する必要があります。

TCPソケットがwakelockなしで十分に機能

http://devtcg.blogspot.com/2009/01/push-services-implementing-persistent.html

生きソケットを維持しようとするいくつかのサンプルコード、:

http://code.google.com/p/android-random/source/browse/#svn/trunk/TestKeepAlive

あなたが使用していない場合setSoTimeout(無限大の場合は0に設定)、電話機がスリープしているときにソケットを有効にしていても、ソケットは長時間持続するようです。私は別のサービスで毎分WakeLockを取得してリリースしていますが。私はTCPソケットに(もしあれば)どのような影響があるのか​​分かりません。

答えて

1

SoLingerフラグを使用して、ソケットが「稼動中」のままになることを想定したい場合があります。私はSSHがこのメカニズムを使用して、あなたが物理的な接続性を失ったとしてもしばらくの間あなたの接続を「準備が整った」状態に保つと信じていますこのフラグを両端に設定するとよいでしょう。

あなたが知っておく必要があることもあります:あなたのリンガータイムアウトが大きい場合(例えば1時間)、接続が失われた場合、close()を呼び出す前にリンガータイムアウトを0に設定します。それ以外の場合は、ソケットがデータをフラッシュするのを待たなければなりません(タイムアウトまたは接続の再確立のため)

関連する問題