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

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

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

  • 开发报警应用
  • 即使我正在发布它,WakeLock仍然保持错误
  • 正确的模式,以获取BroadcastReceiver中的WakeLock并在服务中释放它
  • 如何在睡眠模式下唤醒Android Wear?
  • WakeLock仍然在最后定案
  • 通知收到android时点亮屏幕
  • 在Android上closures屏幕
  • 我怎样才能看到哪些唤醒锁是活跃的
  • 当你从一个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