2013-03-06 77 views
35

我一直在对使用持久套接字的Android设备的自定义推送通知解决方案进行一些测试。我想分享我的发现并验证结果。Android持久套接字连接规则

简单说明
的应用程序运行的前景服务并建立与服务器的连接,并认为通过积极的爆震连接(@ 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,它已被公司政策排除。

谢谢。

+0

为什么你让移动平安,如果你有套接字连接?为什么不仅让服务器发送信息,实际上有什么话要说,有时候还可能有心跳来保存它。 – 2013-10-03 07:40:13

+1

在我们的例子中,连接可以在几个开关之间。我们需要尽快确定无效连接。因此,对于移动客户端的每次ping,服务器都必须作出响应。它保护我们免受无声断线。 – Alex 2013-10-07 14:43:09

+0

我确定在这里有一个很好的问题,但我无法找到它目前的形式如果你仍然在寻找答案,你可以考虑编辑一个更具针对性的问题。 JMHO :-) – Chilledrat 2013-10-16 08:42:16

回答

12

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

其他注意事项:

  • 在广播接收器为爆震报警的onReceive方法,如果你不是直接在插座上调用(产生一个新的线程或意图),你会需要保持唤醒锁,直到ping请求完成。 Android仅保留一个唤醒锁,直到OnReceive返回,之后才有可能(但很少)CPU在ping完成之前休眠。

  • 如果通知是敏感的,则使用High Performance Wifi Lock

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

更新

跑进了以下问题与Android 5.1:2

Android Issue

更新需要围绕打盹模式代码为Android 6.0:Doze Mode

+0

我知道这是一个老问题,不过:您是否获得了传入数据包的WakeLock来处理这些数据?或者换句话说,设备在从网络中唤醒后有多长时间活动? – JavaJens 2014-04-30 15:04:32

+1

是的,虽然您将收到传入数据包而无需持有唤醒锁,但您仍应在收到传入数据时创建唤醒锁。否则,您可能无法在设备进入睡眠状态之前完成数据处理。多长时间的部分,根据设备不同而不同。喜欢这种碎片。 – Alex 2014-04-30 18:02:19