如何使Android设备持有到Internet的TCP连接而无需唤醒locking?

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

如何才能做到这一点? 如何从互联网接收“中断”,而不消耗电池?

Solutions Collecting From Web of "如何使Android设备持有到Internet的TCP连接而无需唤醒locking?"

当你从一个tcpstream读取被阻塞时,设备可以进入深度睡眠,当tcpstream量进入时,它会短暂地唤醒设备,只要读了一点,你就开始一个唤醒锁,直到你收到整个传输然后释放它。

这里是一个与networking套接字的例子,我已经跑了这个应用程序超过12小时的背景,没有电池的影响。 https://github.com/schwiz/android-websocket-example

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

我一直在Android上使用长时间的TCP连接而没有唤醒locking多年。

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

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

一旦networking库通知您接收到新消息,您可以进行唤醒locking。 但是,如果你完成了, 那么确保正确地处理锁,即确保它在某个点和每个代码path中被释放 。 我个人从来没有经历过唤醒锁的需要,Android设备总是足够清醒来处理请求。 但是你的米勒可能会有所不同。

Google Cloud Messaging可能是您正在寻找的内容:

http://developer.android.com/guide/google/gcm/index.html