一般來說,在android
系統中,當某程序較長時間不活動,或系統資源比較緊時,該程序可能被系統
kill
掉,以此來**一些資源。
android
系統會根據程序的優先順序來選擇性地殺死一些程序,優先順序從高到低依次是:
1. 前台程序(foreground process)
2. 可視程序(visible process)
3. 服務程序(service process)
4. 後台程序(background process)
5. 空程序(empty process)
1. 前台程序(
foreground process
)是指當前的活動程序,即那些有視窗、控制項的,正與使用者進行互動的應用程式程序。
android
會努力嘗試從其它程序**系統資源來保持其響應。
2. 可見程序(
visible process
)是指那些可見的活動程序,但是當前它不在前台執行,不能對使用者事件作出反映。比如乙個程式
a正在前台執行,接著又啟動了另乙個程式
b,程式
b的視窗把程式
a的視窗完全或部分遮擋,那麼,程式
a現在就屬於可見程序了。一般來說,只有在系統資源十分缺乏的情況下,為了保證活動程序的執行,系統才會終止它。
3. 服務程序(
service process
)是指那些沒有可見介面的程序,它們不能直接與使用者進行互動。前台程序(通常是乙個
activity
)變為非活動時,會暫停執行;但服務程序可在後台保持執行,因此如果要保持程序在轉到後台後也能執行,就必需啟動乙個
service
。但是一旦前台程序需要資源時,
service
就很容易被系統給
kill
掉。通常,預設情況下
service
被kill
掉後會自動重啟,但是重啟後並不能保證恢復先前的環境;如果不需要
service
自動重啟,呼叫
stopself()
函式即可。
4. 後台程序(
background process
)是指不可見的,且沒有任何正在執行的服務的活動的程序。通常後台程序會比較多,
android
將按「最後乙個被看到,第乙個終止」的方式來終止它們,從而為前台程序提供資源。
5. 對於空程序,
android
為了提高系統的整體效能,經常在在應用程式的生存期結束後仍然把它們儲存在記憶體中,當該程式被再次啟動時,可以加快啟動速度。這類程序會根據需要被定期終止。
由上可知,要想自己所寫的service
不輕易被系統在**資源時
kill
掉,正常的做法是盡量提高程式的優先順序,如呼叫
startforeground(true)
。因為service
啟動時預設被標記為
background
,當前執行的
activity
被標記為
foreground
,當將service
設定為foreground
後,它的優先順序就與正在執行的
activity
類似,但是這也不能保證它不被系統
kill。
如果我們要寫乙個監控程式,監測其它程式的執行,那麼該怎麼辦呢?我們必需保證我們的程式不會因**資源而kill
。顯然,優先順序為
2-5的程序都不可靠,作為監控程式,其優先順序也不可能為1。
這樣看上去,貌似沒有辦法了……別急,繼續看下面……
解決方法:
簡單地說,就是將自己寫的service
變成core service
,即將自己寫的程式提公升為系統級別的程式,這樣在任何情況下它都不會被
kill掉。
要想自己寫的service
提公升為core service
,應用程式需要設定兩個標誌:
flag_persistent
和flag_system。
具體做法如下:
1. 設定flag_persistent
:在androidmanifest.xml
檔案中,加入android:persistent="true" ;
2. 設定
flag_system
:將你寫的應用程式放到
目錄下即可。具體操作如下:
a. 使用
cygwin
或cmd
進入你工程所在的
bin目錄中,然後執行如下兩條命令:
adb remount
命令adb remount
是為了獲取系統目錄的臨時操作許可權,然後使用
push
命令將自己寫的程式包上傳到系統應用程式目錄中。
b. 重啟手機。開機後,在應用列表中就可以看到你寫的程式了。
需要說明的是:系統程式不能像非系統程式那樣使用adb install yourpackage.apk
來安裝apk
包,我們只需要將
apk包拷貝到
目錄下重啟即可。如果使用
adb install
的方式,那麼
flag_system
標誌不會被設定,
flag_persistent
標誌也將不起任何作用。
c. 如果需要解除安裝自己寫的系統應用程式,可執行如下命令:
adb remount
另外,還需要說明的是,如果想在模擬器中加入自己寫的系統級應用程式,好像不行,因為將apk
複製到下後,還必需重啟,但模擬器一重啟,系統目錄也將恢復初始狀態。不過網上好像有人做到了,方法也很簡單,就是將
android
原始碼相應地方稍改下,然後重新編譯……
現在,我們就可以讓我們的程式為所欲為了~
如何讓自己的Android程式永不被系統kill
相關知識 一般來說,在android 系統中,當某程序較長時間不活動,或系統資源比較緊時,該程序可能被系統 kill 掉,以此來 一些資源。android 系統會根據程序的優先順序來選擇性地殺死一些程序,優先順序從高到低依次是 1.前台程序 foreground process 2.可視程序 vis...
如何讓自己時刻冷靜的方法 如何讓自己保持冷靜?
作為平常人的我們,擁有喜怒哀樂等各種情緒是天經地義的事情,這好像一點問題都沒有。若真要說有什麼問題。應該是在於這些情緒的持續時間。不只是負面情感,快樂之類的正面情緒持續太久也會使的人得意忘形。同樣不是什麼好事。事實上,大部分人經歷過這類教訓,都認同 過於衝動只會壞事 的道理。但另一方面,我們也為自己...
如何讓自己快樂!
今天 心情 不是 很好,想 了好多方法,下面的方法 還是不錯的 solution 1 做乙個可愛的人。放飛自己的心情,不埋怨誰,不嘲笑誰,也不羨慕誰,陽光下燦爛,風雨中奔跑,做自己的夢,走自己的路!按自己的思路去做事,心情自然會好。10部能帶給你無盡勇氣的電影 聽見天堂 追夢女孩 陽光小美女 聞香識...