Android開發 強制退出了任務,後台顯示服務還在,但是程序裡面的Socket卻中斷了?

Android開發使用Socket實現推送服務,現在將程序部署到魅族手機上。

1、手機已經手動設置為允許自啟動了;

如圖:

2、在主線程HomeActivity調用觸發了startService,服務使用的是IntentService,Socket存放在IntentService中。

3、手機在運行或者點擊Home鍵都是可以正常收到推送消息的,後台服務也在運行,Socket也未中斷;但是當強制清除任務的時候,在應用管理中心可以看到應用還在運行,但是Socket已經中斷,推送也收到不到了,請問怎麼回事呢?


不謝邀,

1. IntentService 是用於執行單個或多個短時間的任務隊列,不適合用於保持 socket 通訊。請使用 service。

2. 在任務管理器內劃掉後系統會模擬低內存狀態對你的整個 process 來一次回收重建,因此即便顯示的是還在後台,service 也已經重啟了(onGoing 之類除外不過目測你並沒有做類似操作)。

3. 各個國產 ROM 都有各種不同的策略來阻止應用長期在後台運行,自己寫一套推送渠道可以說是經典的臟活了,沒有特殊需求的話請直接對接各種三方 push 渠道。


1.IntentService適合執行一次任務就退出的場景;

2.清除任務時,請在Service關鍵生命周期列印log(onCreate,onDestory,onTaskRemoved),如果Service重新create,socket是否重新建立?

推送服務有很多坑:

1.Service長期駐存後台,如果被killed要有重啟機制(不要用太流氓的方式),特殊機型引導用戶加入白名單;

2.Socket保活要有斷線重連、心跳機制,否則Android系統待機情況下(屏幕滅)了CPU會休眠,導致超時後伺服器端主動斷開連接;

3.心跳機制要結合AlarmManger+WakeLock使用,處理完任務及時釋放,否則會導致耗電較高;

4.Android4.4之後系統調整了電源演算法,AlarmManager repeat會不準確,要採用註冊一次,等收到觸發後重新註冊,依次循環的方式,並且心跳時間不要太短,比如5秒鐘一次心跳,放置幾個小時候,會被系統強制拉長到5分鐘左右不等。

5.另外注意WIFI休眠策略,是否始終保持連接。


推薦閱讀:

這種ui誰能給點思路?
如何優雅地使用Android Studio?
Android Studio 使用起來很卡,你們是如何解決的?
Android Studio有哪些值得推薦的主題背景?
Android studio更新到2.2後,編輯module下的build.gradle文件就卡死?

TAG:Android開發 | Android | Socket | 線程 | AndroidStudio |