1.控制onStartCommand函數的返回值。
我對這個函數的理解是:當服務被異常終止時,是否重啟服務?
有些文章裏面在用這個做保活時,修改的是flag,在我實際測試中是無效。有效的做法是直接返回參數。另外默認的flags值為0,是START_STICKY_COMPATIBILITY。如下:
[java]?view plain?copy
@Override?
public?int?onStartCommand(Intent?intent,?int?flags,?int?startId)?{?
//?TODO?Auto-generated?method?stub?
return?START_STICKY;?
//return?super.onStartCommand(intent,?flags,?startId);?
}?
測試結果:
魅族的機子:無效,不管默認還是修改參數,在DDMS裏面直接結束進程後都不會重啟服務。
其它三臺機子(9100沒測):默認參數的情況下就會重啟服務,return START_STICKY 會重啟,return START_NOT_STICKY 不會重啟。
其它:1.用360壹鍵清理,或者360超級ROOT的手機優化,會殺死進程,過會兒還是會重啟,只是會慢很多,大概是在排隊重啟服務。
2.壹次測試完後確保服務重啟後,執行了onStartCommand函數。
2.在service 的onDestory裏面重啟服務
這個在所有能觸發onDestory的情況下都是有效的。4臺測試機都測試過。直接startService 或者發送廣播重啟都可以 。
但能觸發onDestory的情況,我不知道內存回收會不會觸發。另外兩種情況(2,3)是不觸發的。我的測試方法是在“設置”-》應用管理-》正在運行-》停止服務。(這個是正常停止服務,會觸發onDestory,所以上面的onStartCommand效果不會觸發。)
3.提高服務的優先級
這個主要是針對第壹種kill服務的情況,內存回收機制。由於這個測試比較難搭建。360清理什麽把後臺的進程都殺的,體現不出優先級這樣的概念。我的建議是能提高就提高。下面例幾種。
通知--前臺service
創建壹個通知使自己成為前臺service
測試結果:
360壹鍵清理和手機優化,不會把該service結束掉。
對於後臺保護:華為G730不結束service,魅族和華為TL00H都會結束service。
通知欄的保活效果還是可以的,壹般的應用要求基本能滿足了。
若有root權限:
android:persistent="true",並放入system/app中
測試結果:效果壹般,三星9100上用360等清理工具殺不掉進程,在華為G730上沒什麽效果.(這個測試跟onStartCommand有點幹擾)
4.守護進程
雙服務
360會同時殺掉兩個服務,分兩個apk也壹樣。
native守護進程
360不會殺掉native的守護進程,但在魅族和華為TL00H中待機壹段時間後還是會被殺掉。
結論和待續
1.壹般的應用添加到後臺保護進程後,改個onStartCommand返回值,再加個通知。基本上大部分都能保活了。
2.雙服務我覺得沒有native守護進程來的好,雖然360,微信什麽的都有幾個進程服務,但如果不添加到後臺保活的話,效果壹樣不能保活,也會進入停止狀態。
3.但是.360手機助手會創建雙natice守護進程做相互的看守。存活的效果會高壹點點。“沒添加到後臺保活”壹般只會殺壹次,(魅族是屏幕關閉後5分鐘,華為TL00H是屏幕關閉時)