【发布时间】:2013-03-06 17:34:17
【问题描述】:
我一直在为使用持久套接字的 Android 设备定制推送通知解决方案做一些测试。我想分享我的发现并验证结果。
简单说明
应用程序运行前台服务并与服务器建立连接,并通过积极 ping(@ 10 秒间隔)维持该连接。如果检测到连接已失效,则应用程序会无限期地尝试重新连接。服务器通过双工通道发送通知。
测试 1:
Pinging is done using a timer at 10 second intervals.
Server sends notification every minute.
Applications acquires wifi and wake locks.
Duration : 8 hours
Battery loss : ~14%
测试 2:
Pinging is done using AlarmManager at 10 second intervals.
Server sends notification every minute.
Application acquires only a wifilock
Duration : 8 hours
Battery loss : ~7%
假设:传入的网络数据包会自动唤醒 CPU,因此不需要唤醒锁。使用 AlarmManager 来 ping(而不是计时器)意味着我们不需要唤醒锁。
移除唤醒锁似乎确实对电池有帮助。令人惊讶的是,对任一解决方案的积极 ping 并没有像我预期的那样影响电池寿命。 (我们进行了许多其他测试,包括应用程序仅持有一个 wifilock 并且什么也没做,这导致同期电池损耗约为 4% 到 5%)
由于应用程序能够成功发送所有 ping 请求并接收所有传入消息,我相信我的假设是正确的。但我很想得到任何专家的确认。
还有一个问题: 如果应用程序改为侦听传入连接。在这种情况下,我需要保持唤醒锁,对吗?传入连接不会唤醒 CPU?我们不会走这条路,只是想确认一下。
另外,请不要推荐GCM,公司政策已经排除了。
谢谢。
【问题讨论】:
-
如果您有套接字连接,为什么要让移动设备 ping?为什么不只让服务器在确实有话要说的时候发送信息,有时可能还有心跳来让它保持活力。
-
在我们的例子中,连接可以在几个交换机之间。我们需要尽快确定无效连接。因此,对于移动客户端的每次 ping,服务器都必须做出响应。它可以保护我们免受无声的断开连接。
-
我确定这里有一个很好的问题,但我无法以当前形式找到它 如果您仍在寻找答案,您可以考虑编辑一个更有针对性的问题。 JMHO :-)
-
" 我们需要尽快确定无效连接。因此对于移动客户端的每次 ping,服务器都必须响应。"我认为底层传输协议,我想是 TCP,通过周期性的心跳来做到这一点。 Android客户端不是这样吗?如果有TCP心跳,我想知道它们对电池有多大影响......?
-
伟大的发现..老兄....!!
标签: android sockets tcp wakelock batterylevel