進程的優(yōu)先級
1、前臺進程:即與用戶正在交互的Activity或者Activity用到的Service等,如果系統(tǒng)內(nèi)存不足時前臺進程是最后被殺死的
2、可見進程:可以是處于暫停狀態(tài)(onPause)的Activity或者綁定在其上的Service,即被用戶可見,但由于失去了焦點而不能與用戶交互
3、服務(wù)進程:其中運行著使用startService方法啟動的Service,雖然不被用戶可見,但是卻是用戶關(guān)心的,例如用戶正在非音樂界面聽的音樂或者正在非下載頁面自己下載的文件等
4、后臺進程:其中運行著執(zhí)行onStop方法而停止的程序,但是卻不是用戶當前關(guān)心的,例如后臺掛著的QQ,這樣的進程系統(tǒng)一旦沒了有內(nèi)存就首先被殺死
5、空進程:不包含任何應(yīng)用程序的程序組件的進程,一般用于緩存
PS:前三種進程只要系統(tǒng)內(nèi)存足夠就不會被殺死,如果系統(tǒng)內(nèi)存不足會按照優(yōu)先級高低殺死進程,后兩種進程隨時會被系統(tǒng)殺死
進程的回收策略
Android中的進程回收主要是通過系統(tǒng)進程管理機制中的Low Memory Killer來進行回收的,具體的回收策略是通過判斷OOM_ADJ這個閾值來決定回收哪些進程,OOM_ADJ的值越大,該進程的優(yōu)先級越低,越容易被系統(tǒng)回收。只有當系統(tǒng)檢測到設(shè)備內(nèi)存不足時才會啟動進程回收機制。
OOM_ADJ >= 4:比較容易被殺死的進程
OOM_ADJ 0 ~ 3:不容易被殺死的進程
OOM_ADJ < 0 :純Linux進程,非Android進程
進程保活方案
主要有兩個方向的方案:
(1)提供進程優(yōu)先級,降低進程被殺死的概率
(2)在進程被殺死后,進行拉活
在進程被殺死后,進行拉活的方案:
(1)利用系統(tǒng)廣播拉活:由于系統(tǒng)廣播會在系統(tǒng)發(fā)生特定事件的時候想廣播接收者發(fā)送廣播,所以可以在App中注冊系統(tǒng)廣播接收者,必須通過在Manifest文件中靜態(tài)注冊方式進行監(jiān)聽注冊,因為靜態(tài)注冊的廣播接收者不需要啟動App就能接受發(fā)送的廣播,所以我們可以在收到系統(tǒng)廣播時進行進程拉活。缺點是有可能被管理軟件通過禁止自啟動的方式導(dǎo)致無法接收到廣播,而且系統(tǒng)廣播發(fā)送的時機不可控導(dǎo)致進程拉活的時間也不可控。
(2)利用系統(tǒng)Service機制拉活:Service的回調(diào)方法onStartCommand()有一個參數(shù)可以設(shè)置為START_STICKY,作用是 當Service因為內(nèi)存不足而被系統(tǒng)殺掉后,接下來未來的某個時間內(nèi),當系統(tǒng)內(nèi)存足夠可用的情況下,系統(tǒng)將會嘗試重新創(chuàng)建此Service,在重新創(chuàng)建Service時進行進程拉活。缺點是一旦在短時間內(nèi)Service被殺死達到5次,系統(tǒng)將不再重新創(chuàng)建。
(3)利用Native進程拉活
(4)利用JobScheduler機制拉活
(5)利用賬號同步機制拉活