我希望我的应用程序能通过移动连接连接到服务器,同时允许设备进入睡眠模式。我期望当IP包到达时它会自动唤醒。
如何实现这一点? 如何在不耗尽电池的情况下接收来自互联网的“中断”?
我希望我的应用程序能通过移动连接连接到服务器,同时允许设备进入睡眠模式。我期望当IP包到达时它会自动唤醒。
如何实现这一点? 如何在不耗尽电池的情况下接收来自互联网的“中断”?
当你在从TCP流中读取数据时被阻塞时,设备可以进入深度睡眠状态,当TCP流量到达时,它会短暂地唤醒设备,只要读取了一点数据,就开始一个WakeLock,直到接收到整个传输,然后释放它。
这里有一个关于WebSockets的示例,我在后台运行了超过12小时,并没有影响电池寿命。 https://github.com/schwiz/android-websocket-example
客户端在这里,阻塞式读取在start方法中。 https://github.com/schwiz/android-websockets/blob/master/src/com/codebutler/android_websockets/HybiParser.java
我已经在Android上使用长连接TCP连接数年了,而且没有唤醒锁定。
我的经验是,当数据到达TCP连接并且设备处于深度睡眠状态时,设备会被唤醒至少一小段时间。有时唤醒设备可能需要长达约2分钟的时间,但通常只需要几秒钟。
现在设备已经唤醒,接收进程有一些时间来处理数据。现在,无论是进程在将设备放回深度睡眠之前能够完成处理数据,还是设备将进入深度睡眠以挂起进程,此时重要的是数据不会丢失,它仍然存储在内存中,进程能够在设备离开深度睡眠后恢复处理数据的工作。当然,这意味着如果发送方等待数据的答复,可能需要一些时间才能得到答复。
当您的网络库通知您接收到新消息时,您可以立即获取唤醒锁。但是,如果您这样做,请确保正确处理锁定,例如确保在某些点和每个代码路径上都释放它。就我个人而言,我从未感到需要唤醒锁定,Android设备总是足够长时间处于唤醒状态来处理请求。但是,您的情况可能会有所不同。
这个问题很老了,但我最近测试了@Flow描述的行为,并想确认一下,有时数据到达和设备唤醒之间似乎存在任意延迟。
我使用了tcpClient实现和mqttimplementation进行了测试。我的想法是看看是否需要立即获取wakelock,因为这种延迟出现在我的mqtt实现中。
测试设置:
在这两种实现中,似乎有时会出现任意延迟来调用我们的代码。这使得最有可能存在设备唤醒的延迟,而不是获取wakelock的延迟。
Google Cloud Messaging (GCM)可能是你正在寻找的东西: