我可以摆脱WakeLock吗?

时间:2011-08-08 08:27:07

标签: android

我的应用在后台运行了几项服务。他们使用:长期的TCP连接,GPS,Accelerometer和android.os.CountDownTimer。

我已经知道Accelerometer和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 个答案:

答案 0 :(得分:1)

您可能需要考虑使用SoLinger标志,以便在预期关闭时保持套接字“活着”。我相信即使你丢失了物理连接,SSH也会使用这种机制让你的连接“准备好”一段时间。您需要在两端设置此标志。

还有一些事情你需要注意:如果你的延迟超时很大(比如 - 一小时),你失去了连接,你需要在你调用close()之前将linger timeout设置为0。否则你将不得不等待套接字刷新数据(由于超时或连接重建)