Android 节能模式下的网络连接

Android 节能模式下的网络连接,android,android-service,Android,Android Service,在调查我从用户那里得到的一份报告时,我注意到,当启用省电模式(Nexus 4,Android 5.1.1)时,下载数据的后台服务在一段时间后会出现连接异常。当设备屏幕关闭时会发生这种情况,但未在屏幕打开时对其进行测试 在操作过程中,PowerManager.PARTIAL_WAKE_LOCK和WifiManager.WIFI_MODE_FULL均保持不动。我使用OkHttp进行连接,Wifi一直处于打开状态 在这种情况下,除了持有两个锁(wifi和部分唤醒),我还能做什么?这对于用户使这些连接正

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

在操作过程中,PowerManager.PARTIAL_WAKE_LOCK和WifiManager.WIFI_MODE_FULL均保持不动。我使用OkHttp进行连接,Wifi一直处于打开状态

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

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预见到了一种解决方法——它被称为前台服务。若服务作为前台启动,它将被视为用户活动,并且在资源不足时不会被删除


<>您可以考虑将所有关键活动移到前台,并在后台服务

中保留所有支持模块(例如,分析)。谢谢您的输入。实际上我忘了提到我的服务是前台服务。我会看看它的前台状态是否被正确处理。我将您的答案标记为正确的答案-问题更详细,但实际上前台服务是这里必须使用的一切。问题是,我的服务在一段时间内(一两秒钟,当它做其他工作时)不再是前台,然后返回前台状态。这足以让Android停止我的应用程序的网络访问。