如何让Android设备在没有唤醒锁定的情况下保持与Internet的TCP连接?

Vi.*_*Vi. 13 networking android standby wakelock

我希望我的应用程序通过移动连接连接到服务器,但允许设备进入睡眠模式.我希望它能在IP包装到来时醒来.

如何才能做到这一点?如何在不耗尽电池的情况下从互联网接收"中断"?

Nat*_*ann 23

当您从tcp流读取时被阻止时,设备可以进入深度睡眠状态,当tcp流量进入时,它会短暂唤醒设备,只要读入一点,就会启动唤醒锁,直到您收到整个传输然后释放它.

这是一个使用网络套接字的示例,我在后台运行此应用程序超过12小时,没有电池影响. https://github.com/schwiz/android-websocket-example

客户端在这里,阻塞读取在start方法中. https://github.com/schwiz/android-websockets/blob/master/src/com/codebutler/android_websockets/HybiParser.java

  • @kknot1只有当数据实际通过管道传输时,通信之间才没有唤醒锁.我离开这个编程运行了超过12个小时,并且在我所有的保持活动的ping之后注册了不到3秒的唤醒时间.这正是我所说的,事实上也是如此. (4认同)

Flo*_*low 11

多年来,我一直在Android上使用长生活TCP连接而没有唤醒锁定.

我的经验是,当数据到达TCP连接并且设备处于深度睡眠状态时,它将至少在短时间内被唤醒.唤醒设备有时可能需要约2分钟,但通常在几秒钟内完成.

现在设备处于唤醒状态,接收过程也有一段时间处理数据.现在要么该过程能够在设备重新进入深度睡眠之前这样做,要么设备将被置于深度睡眠中以暂停该过程.这里重要的是数据不会丢失,它保留在内存中,并且该过程能够在下次设备离开深度睡眠时恢复处理数据的工作.当然,这意味着如果发件人等待他的数据的答案,可能需要一些时间,直到他得到它.

一旦您的网络库通知您收到了新消息,您可以进行唤醒锁定.但是如果你做了,那么确保正确处理锁,即确保它在某个点和每个代码路径中被释放.我个人从来没有经历过唤醒锁的需要,Android设备总是足够清醒来处理请求.但你的耕作可能会有所不同.