省电模式下的网络连接

Network connection in power saving mode

在调查我从用户那里收到的一份报告时,我注意到当启用省电模式时(Nexus 4,Android 5.1.1)下载数据的后台服务在一段时间后出现连接异常.当设备屏幕关闭时会发生这种情况,没有在屏幕打开时对其进行测试。

操作中有PowerManager.PARTIAL_WAKE_LOCKWifiManager.WIFI_MODE_FULL。我正在使用 OkHttp 进行连接并且 Wifi 一直处于打开状态。

在这种情况下,除了同时持有两个锁(wifi 和 partial_wake),我还能做什么?这对于用户让这些连接正常工作至关重要。

Stacktrace - 但是我认为它在这里并不相关:

W/System.err: java.util.concurrent.ExecutionException:   java.net.ConnectException: Failed to connect to *************
W/System.err:     at java.util.concurrent.FutureTask.report(FutureTask.java:93)
W/System.err:     at java.util.concurrent.FutureTask.get(FutureTask.java:177)
....
W/System.err: Caused by: java.net.ConnectException: Failed to connect to **************
W/System.err:     at okhttp3.internal.io.RealConnection.connectSocket(RealConnection.java:139)
W/System.err:     at okhttp3.internal.io.RealConnection.connect(RealConnection.java:108)
W/System.err:     at okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:188)
W/System.err:     at okhttp3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:127)
W/System.err:     at okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
W/System.err:     at okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:289)
W/System.err:     at okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:241)
W/System.err:     at okhttp3.RealCall.getResponse(RealCall.java:240)
W/System.err:     at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:198)
W/System.err:     at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
W/System.err:     at okhttp3.RealCall.execute(RealCall.java:57)
...

编辑:wifi 和移动数据连接都会发生这种情况。我还确认正在持有唤醒锁并且一切都按预期工作,除了无法连接的事实。当屏幕打开时,一切正常,但保持屏幕打开在这里不是一个可接受的解决方案

如您所述 - 这可能是因为省电模式。在此模式下,系统会尽量减少唤醒调用的次数并停止所有它认为不必要的进程。

幸运的是 Android 预见了一种处理此问题的方法 - 它称为前台服务。如果服务作为前台启动,它将被视为用户 activity,并且在资源不足时不会被删除。

您可以考虑将所有关键活动移至前台,而将所有支持模块(例如,分析)留在后台服务