42

所以......我正在为Android制作一个应用程序。应用程序需要发送和接收实时聊天数据(需要是一个套接字),但它还需要发送命令(客户端不知道它何时发送)。

我需要知道在节省用户电池方面什么是更好的解决方案。

a)每次发送命令时打开和关闭连接,如果打开聊天选项卡,则保持连接不变。

b)始终保持连接不变。

我浏览了互联网,但得到的答案不一,有人说保持持久连接不利于电池寿命,而另一些人则说不是(例如:“你问保持 TCP 连接打开是否会耗尽电池电量-life?也许我离这里很远,但是,保持连接打开不应该浪费电池寿命......如果你认为它会我很想知道你从哪里得到这些信息。这对我来说听起来很奇怪。“

或者如果有其他更好的解决方案。我也不认为 Google 的 C2DM 在这种情况下会非常有用。

基本上,什么会更耗电:保持连接,或者打开和关闭连接,除非打开聊天选项卡?

谢谢!

4

3 回答 3

66

保持空闲 TCP 套接字连接打开(没有发送或接收数据)不会(或至少不应该)比关闭它消耗更多的电池。这是因为空闲的 TCP 连接不使用带宽或 CPU 周期 (*)。

也就是说,长时间保持 TCP 连接打开对于移动设备来说可能不是一个好的选择,因为 TCP 连接不能与进入睡眠状态的计算机进行良好的交互。问题场景是这样的:您的 Android 用户在您的应用程序运行时让他的 Android 设备进入睡眠状态,然后远程用户的程序(或 TCP 连接另一端的任何程序)通过 TCP 流发送一些数据。远程用户的程序永远不会从 Android 设备收到任何 ACK,因为当然 Android 设备处于休眠状态,所以远程设备的 TCP 堆栈假定它发送的 TCP 数据包一定已经丢失,并通过增加超时时间来响应,减小其 TCP 窗口大小(即一次允许在飞行中允许的 TCP 数据包数量),并重新发送 TCP 数据包。但是 Android 设备仍然处于休眠状态,因此同样的事情再次发生。结果是几分钟后,TCP 连接的远程端已经减慢到即使 Android 设备要唤醒,TCP 连接也可能太慢而无法使用——此时您的程序将需要关闭陷入困境的 TCP 连接并启动一个新的连接,所以为什么还要尝试保持打开状态呢?

因此,我的建议是使用选项 (a),并规定您关闭 TCP 连接作为您的设备现在进入睡眠例程的一部分。

一个可能的警告是,如果 Android 具有一个功能,即保持 TCP 连接打开会导致 WiFi 或蜂窝网络硬件在否则可能进入睡眠状态的情况下保持通电 - 如果是这种情况,那么 Android设备将为天线供电支付电池成本,否则它不必支付。我不知道有任何类似的 Android 逻辑,但我只使用了一点 Android,所以这可能只是我的无知。至少它可能值得测试。

(*) 好吧,从技术上讲,TCP 确实会在 TCP 连接打开时每隔一段时间发送一个“keepalive”数据包,这确实会占用一些 CPU 周期和天线功率……但在 Android 上发送 keepalive 数据包的默认间隔是两个小时,所以我怀疑用于此的力量会很明显。

于 2012-08-03T05:32:03.083 回答
1

为了真正保持连接打开,您可能必须来回发送心跳信号,因为 android 设备和您的服务器之间的任何有状态路由器都会在相对较短的时间后忘记连接。

哪个更好取决于您认为无需连接到服务器即可使用多长时间。如果您在大多数情况下大约每 30 秒左右连接一次,请务必保持连接打开,但如果没有,您最好关闭它。

于 2012-08-03T05:49:20.780 回答
1

电池与 3G 上从 DCH/FACH/IDLE 的无线电状态转换非常相关。如果您想拥有一个节能的应用程序,您应该在有限的时间间隔内发送尽可能多的数据,与持久连接无关......

于 2013-06-14T12:09:25.737 回答