Android 其實無法做多絕對的不被後臺kill掉,我們只能儘量使用一些操作提升不被kill的機會。 一、onStartCommand方法,返回START_STICKY START_STICKY 在運行onStartCommand後service進程被kill後,那將保留在開始狀態,但是不保留那些 ...
Android 其實無法做多絕對的不被後臺kill掉,我們只能儘量使用一些操作提升不被kill的機會。 一、onStartCommand方法,返回START_STICKY START_STICKY 在運行onStartCommand後service進程被kill後,那將保留在開始狀態,但是不保留那些傳入的intent。不久後service就會再次嘗試重新創建,因為保留在開始狀態,在創建 service後將保證調用onstartCommand。如果沒有傳遞任何開始命令給service,那將獲取到null的intent。 START_NOT_STICKY 在運行onStartCommand後service進程被kill後,並且沒有新的intent傳遞給它。Service將移出開始狀態,並且直到新的明顯的方法(startService)調用才重新創建。因為如果沒有傳遞任何未決定的intent那麼service是不會啟動,也就是期間onstartCommand不會接收到任何null的intent。 START_REDELIVER_INTENT 在運行onStartCommand後service進程被kill後,系統將會再次啟動service,並傳入最後一個intent給onstartCommand。直到調用stopSelf(int)才停止傳遞intent。如果在被kill後還有未處理好的intent,那被kill後服務還是會自動啟動。因此onstartCommand不會接收到任何null的intent。 二、提升service優先順序 在AndroidManifest.xml文件中對於intent-filter可以通過android:priority = "1000"這個屬性設置最高優先順序,1000是最高值,如果數字越小則優先順序越低,同時適用於廣播。 三、提升service進程優先順序 Android中的進程是托管的,當系統進程空間緊張的時候,會依照優先順序自動進行進程的回收。Android將進程分為6個等級,它們按優先順序順序由高到低依次是: 1.前臺進程( FOREGROUND_APP) 2.可視進程(VISIBLE_APP ) 3.次要服務進程(SECONDARY_SERVER ) 4.後臺進程 (HIDDEN_APP) 5.內容供應節點(CONTENT_PROVIDER) 6.空進程(EMPTY_APP) 當service運行在低記憶體的環境時,將會kill掉一些存在的進程。因此進程的優先順序將會很重要,可以使用startForeground 將service放到前臺狀態。這樣在低記憶體時被kill的幾率會低一些。 四、onDestory裡面發送廣播重啟service service +broadcast 方式,就是當service走ondestory的時候,發送一個自定義的廣播,當收到廣播的時候,重新啟動service; 五、Application加上Persistent屬性 六、監聽系統廣播判斷Service狀態 通過系統的一些廣播,比如:手機重啟、界面喚醒、應用狀態改變等等監聽並捕獲到,然後判斷我們的Service是否還存活,別忘記加許可權啊。 七、雙進程Service 讓2個進程互相保護,其中一個Service被清理後,另外沒被清理的進程可以立即重啟進程 八、聯繫廠商,加入白名單