2011-08-08 96 views
0

我的應用程序有幾個服務在後臺運行。他們使用:長期居住的TCP連接,GPS,Accelerometer和android.os.CountDownTimer。我可以擺脫WakeLock嗎?

我已經知道加速度計和CountDownTimer需要一個部分WakeLock工作,當我的手機進入睡眠狀態(Android 2.2),GPS不需要WakeLock,不知道TCP套接字嗎?

CountDownTimer希望可以替換爲java.util.Timer,我認爲它仍然可以在沒有WakeLock的情況下工作?然後,我可以獲取/釋放WakeLock以進行週期性加速度計檢查。然後當Acclerometer檢測到移動時,我可以打開GPS。如果沒有GPS信號,我可以回到我的計時器滿圈。

這個工作沒有永久性的WakeLock嗎?我不知道TCP連接。

編輯︰ 原來你不得不在深度睡眠時使用AlarmManager,當沒有喚醒鎖定設置得到準確的定時器。

TCP套接字的作品不夠好沒有激活鎖定:

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使用這種機制來保持連接「準備好」一段時間,即使您失去了物理連接。你會想在兩端設置這個標誌。如果你的逗留時間很長(例如 - 一個小時),你失去了連接,你需要在你調用close()之前將逗留時間設置爲0。否則,您將不得不等待套接字刷新數據(由於超時或連接重新建立)

相關問題