保持空闲 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 数据包的默认间隔是两个小时,所以我怀疑用于此的力量会很明显。