【问题标题】:Android persistent socket connection rulesAndroid 持久套接字连接规则
【发布时间】: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


【解决方案1】:

由于有人对这个问题感兴趣并且没有得到确认,我现在就回复。自测试完成以来已经有一段时间了,并且已经创建并严格测试了生产级解决方案。移除唤醒锁仍然对电池有帮助,并且没有发现其他问题,例如缺少 ping 请求或传入通知,因此这是我收到的关于上述假设的唯一验证。

需要注意的其他事项:

  • 在用于 ping 警报的 BroadcastReceiver 的 OnReceive 方法中,如果您不直接调用套接字(产生新线程或意图),则需要保持唤醒锁直到 ping 请求完成. Android 仅在 OnReceive 返回之前保持唤醒锁定,之后 CPU 可能会(但很少)在 ping 完成之前休眠。

  • 如果通知很敏感,请使用High Performance Wifi Lock

  • 还有一个影响解决方案的其他设备特定问题,它被覆盖here

更新

在 Android 5.1 中遇到以下问题:Android Issue

更新 2

需要围绕 Android 6.0 的打盹模式编写代码:Doze Mode

【讨论】:

  • 我知道这是一个老问题,但是:您是否在传入数据包上获得了唤醒锁来处理这些数据包?或者换句话说,设备从网络中唤醒后的活动时间是多久?
  • 是的,虽然您将接收传入的数据包而无需持有唤醒锁,但您仍应在接收传入数据时创建唤醒锁。否则,您可能无法在设备进入睡眠状态之前完成数据处理。多长时间部分,因设备而异。一定会喜欢这种碎片化。
  • 这是一个很老的问题,但是关于你的更新 2 关于打盹模式的任何说明?我发现套接字连接没有到达我正在测试我的应用程序的 6.0+ 设备,我猜这是因为打盹模式。尽管设置了高性能 Wifi Lock,但它不会响应套接字请求。是否容易避免或忽略打盹模式?白名单?
  • Google 正在尝试走 Apple 的路线,并且真的希望您使用他们的推送通知系统 (Firebase)。幸运的是,正如您所说,您可以请求用户将您的应用列入白名单,以免受到打盹模式的影响(类似于权限)。请注意,除非您有充分的理由加入白名单,否则 Google 可能会拒绝您将应用提交到 Play 商店。此外,在针对更新的 API 级别时,AlarmManager 确实有一些限制,即使白名单也无济于事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多