所以......我正在为Android制作应用程序。应用程序需要发送和接收实时聊天数据(需要是一个套接字),但它还需要发送命令(这不是客户端在发送内容时知道的)。
我需要知道在节省用户电池方面什么是更好的解决方案。
a)每次发送命令时打开和关闭连接,如果打开聊天选项卡,则保持连接不变。
b)始终保持连接不变。
我已经浏览了互联网,但得到了不同的答案,有人说保持持久的连接对电池寿命有害,而有些人则说它不是(例如:“你是否在问打开TCP连接会耗尽电池续航时间吗?也许我在这里开门了,但打开连接不应该浪费电池寿命......如果你认为我会想知道你在哪里得到这些信息。听起来很奇怪对我来说。“)
或者,如果有另一种解决方案会更好。我不认为谷歌的C2DM在这种情况下也会非常有用。
基本上,更多的是耗尽电池:持续连接,或打开和关闭连接,除非聊天标签打开?
谢谢!
答案 0 :(得分:62)
保持空闲的TCP套接字连接打开(没有数据被发送或接收)将不会(或至少不应该)消耗更多的电池而不是关闭它。这是因为空闲TCP连接不使用带宽或CPU周期(*)。
也就是说,保持TCP连接长时间打开可能不是移动设备的好选择,因为TCP连接与睡眠的计算机不能很好地交互。问题场景是:您的Android用户在您的应用运行时让他的Android设备进入休眠状态,然后远程用户的程序(或TCP连接另一端的任何内容)通过TCP流发送一些数据。远程用户的程序永远不会从Android设备获得任何ACK,因为当然Android设备处于睡眠状态,因此远程设备的TCP堆栈假定它发送的TCP数据包必定已经丢失,并且它通过增加其超时时间来响应,减少其TCP窗口大小(也称为TCP-packets-number-of-in-flight-at-once),并重新发送TCP数据包。但Android设备仍处于睡眠状态,因此同样的事情再次发生。结果是几分钟后,TCP连接的远程端已经放慢到即使Android设备被唤醒的程度,TCP连接可能太慢而无法使用 - 此时你的程序将需要关闭陷入困境的TCP连接,并启动一个新的,所以为什么还要努力保持它开放?
因此,我的建议是选择(a),并规定您关闭TCP连接,作为设备即将进入睡眠状态的一部分。
一个可能的警告是,如果Android具有保持TCP连接打开的功能,则会导致WiFi或蜂窝网络硬件在可能进入睡眠状态的情况下保持通电状态 - 如果是这种情况,那么Android设备将为天线供电支付电池成本,否则无需付费。我不知道这样的任何Android逻辑,但我只使用了一点Android,所以我可能只是无知。至少可能值得测试。
(*)嗯,从技术上讲,TCP确实会在TCP连接打开时发送“keepalive”数据包,这确实会使用一些CPU周期和天线功率......但在Android上发送keepalive数据包的默认时间间隔是two hours,所以我怀疑用于此的能力是显而易见的。
答案 1 :(得分:1)
为了实际保持连接打开,您可能必须来回发送心跳信号,因为Android设备和服务器之间的任何有状态路由器会在相对较短的超时后忘记连接。
哪个更好都取决于您认为自己无需连接服务器的时间。如果你大部分时间都在大约每30秒左右连接一次,那么一定要保持连接打开,但如果没有,你可能最好关闭它。
答案 2 :(得分:1)
电池与来自DCH / FACH / IDLE的3G上的无线电状态转换非常相关。 如果你想拥有一个节能的应用程序,你应该在与持久连接无关的有限时间间隔内发送尽可能多的数据......