一、如何?一個不會被殺死的進程
看Android的文檔知道,當進程長期不活動,或系統需要資源時,會自動清理門戶,殺死一些Service,和不可見的Activity等所在的進程。但是如果某個進程不想被殺死(如資料緩衝進程,或狀態監控進程,或遠程服務進程),應該怎麼做,才能使進程不被殺死。
add android:persistent="true" into the <application> section in your AndroidManifest.xml
切記,這個不可濫用,系統中用這個的service,app一多,整個系統就完蛋了。
目前系統中有phone等非常有限的,必須一直活著的應用在試用。
二、提升service優先順序的方法
Android 系統對於記憶體管理有自己的一套方法,為了保障系統有序穩定的運信,系統內部會自動分配,控製程序的記憶體使用量。當系統覺得當前的資源非常有限的時候,為了保 證一些優先順序高的程式能運行,就會殺掉一些他認為不重要的程式或者服務來釋放記憶體。這樣就能保證真正對使用者有用的程式仍然再運行。如果你的 Service 碰上了這種情況,多半會先被殺掉。但如果你增加 Service 的優先順序就能讓他多留一會,我們可以用 setForeground(true)
來設定 Service 的優先順序。
為什麼是foreground?預設啟動的Service是被標記為background,當前啟動並執行Activity 一般被標記為foreground,也就是說你給Service設定了foreground那麼他就和正在啟動並執行Activity類似優先順序得到了一定的提高。當讓這並不能保證你得Service永遠不被殺掉,只是提高了他的優先順序。
從Android 1.5開始,一個已啟動的service可以調用startForeground(int, Notification)將service置為foreground狀態,調用stopForeground(boolean)將service置為background狀態。
我們會在調用startForeground(int, Notification)傳入參數notification,它會在狀態列裡顯示進行中的foreground service。background service不會在狀態列裡顯示。
在Android 1.0中,將一個service置為foreground狀態:
setForeground(true);
mNM.notify(id, notification);
將一個service置為background狀態:
mNM.cancel(id);
setForeground(false);
對比看出,在1.0 API中調用setForeground(boolean)只是簡單的改變service的狀態,使用者不會有任何覺察。新API中強制將 notification和改變service狀態的動作綁定起來,foreground service會在狀態列顯示,而background service不會。
Remote service controller & binding
跨進程調用Service。暫時不研究。
三、如何防止Android應用中的Service被系統回收? 很多朋友都在問,如何防止Android應用中的Service被系統回收?下面簡單解答一下。
對於Service被系統回收,一般做法是通過提高優先順序可以解決,在AndroidManifest.xml檔案中對於intent-filter可以通過android:priority = "1000"這個屬性設定最高優先順序,1000是最高值,如果數字越小則優先順序越低,同時實用於廣播,推薦大家如果你的應用很重要,可以考慮通過系統常用intent action來觸發。