之前學習了SocketClient的使用,並且用它成功實現了項目的開發(具體見本人上一篇帖子:Android SocketClient使用實例)。不過後來測到一個問題,就是打開我們的app連接上socket之後,如果點手機home鍵,切出去一會兒(大概三分鐘左右),然後再切進我們的app,經常會出現socket斷開連接的情況。
最開始以爲是心跳包的問題,因爲心跳包的收發是我們自己在客戶端實現的,不是在android原生實現的。然後各種改測,發現並不是心跳包的問題。然後懷疑是SocketClient的源碼有問題,但是檢查了下也沒看出什麼毛病,實在是鬱悶。所幸在網上看到有網友也遇到手機休眠導致socket斷開的問題,說是android系統出於節電考慮,在屏幕關閉一段時間後會將socket服務掛起。雖然情況不太一樣(畢竟人家是休眠,我的是切出去),但是導致的結果很像。抱着死馬當作活馬醫的心態,用PowerManager試了試,結果還真管用,而且鎖屏也不會導致socket斷開了!
下面是通過PowerManager設置電源模式,使cpu不進入節電模式:
- PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
- wl.acquire();
- ..screen will stay on during this section..
- wl.release();
因爲app使用activity,故在oncreate中wl.acquire();,在ondestroy中wl.release();
加權限:android.permission.WAKE_LOCK問題到此暫時解決。
參考:https://www.jianshu.com/p/45957e180925
https://blog.csdn.net/hhbgk/article/details/49997291