【问题标题】:Network connection in power saving mode省电模式下的网络连接
【发布时间】:2016-08-26 21:39:14
【问题描述】:

在调查我从用户那里得到的一份报告时,我注意到当启用省电模式(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 android-service


    【解决方案1】:

    正如您所提到的 - 这可能是因为省电模式。在这种模式下,系统会尽量减少唤醒呼叫的数量并停止它认为不必要的所有进程。

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

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

    【讨论】:

    • 感谢您的意见。实际上我忘了提到我的服务是前台服务。我会看看它的前台状态处理是否正确。
    • 我将您的答案标记为正确答案 - 问题更详细,但实际上前台服务是这里必须使用的一切。问题是我的服务在一段时间内停止了前台(一两秒,同时它做了其他工作),然后返回前台状态。这足以让 Android 终止我的应用程序的网络访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多