在調查我從用戶那裏獲得的報告之一時,我注意到當啓用省電模式(Nexus 4,Android 5.1.1)時,下載數據的後臺服務在一段時間後會出現連接異常。這發生在設備屏幕關閉時,沒有在屏幕上進行測試。省電模式下的網絡連接
有同時按住PowerManager.PARTIAL_WAKE_LOCK和WifiManager.WIFI_MODE_FULL在行動中。我正在使用OkHttp進行連接,並且Wifi始終處於開啓狀態。
除了在這種情況下持有兩個鎖(wifi和partial_wake),我還能做什麼?這對於用戶使這些連接正常工作至關重要。
堆棧跟蹤 - 但它是不是真的與此有關,我認爲:
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和移動數據連接。我還證實,喚醒鎖正在被擱置,除了事實上沒有任何連接可能,所有事情都按照假設工作。屏幕開啓時,一切正常,但保持屏幕不是一個可接受的解決方案在這裏
感謝您的輸入。其實我忘了提到我的服務是前臺服務。我會看看它的前臺狀態是否正確處理。 – mhenryk
我正在將您的答案標記爲正確答案 - 問題更爲詳細,但實際上Foreground Service是您必須在此使用的所有內容。問題在於我的服務在一段時間內停止了前臺(一兩秒鐘,而它做了其他工作),然後返回到前臺狀態。這足以讓Android終止我的應用的網絡訪問權限。 – mhenryk