Low Memory Killer
打開的應用越多,后臺緩存的進程也越多。因為系統(tǒng)出于體驗和性能上的考慮,app在退到后臺時系統(tǒng)并不會真正的kill掉這個進程,而是將其緩存起來。于是在系統(tǒng)內(nèi)存不足的情況下,系統(tǒng)開始依據(jù)自身的一套進程回收機制來判斷要kill掉哪些進程,以騰出內(nèi)存來供給需要的app, 這套殺進程回收內(nèi)存的機制就叫 Low Memory Killer。
進程的優(yōu)先級(by:https://developer.android.google.cn/guide/components/activities/process-lifecycle?hl=zh-cn)

前臺進程
用戶正在使用的程序,一般系統(tǒng)是不會殺死前臺進程的,除非用戶強制停止應用或者系統(tǒng)內(nèi)存不足等極端情況會殺死。
可見進程
用戶正在使用,看得到,但是摸不著,沒有覆蓋到整個屏幕,只有屏幕的一部分可見進程不包含任何前臺組件,一般系統(tǒng)也是不會殺死可見進程的,除非要在資源吃緊的情況下,要保持某個或多個前臺進程存活施。
服務進程
在內(nèi)存不足以維持所有前臺進程和可見進程同時運行的情況下,服務進程會被殺死。
后臺進程
系統(tǒng)可能隨時終止它們,回收內(nèi)存。
空進程
某個進程不包含任何活躍的組件時該進程就會被置為空進程,完全沒用,殺了它只有好處沒壞處,第一個干它。
內(nèi)存閾值
內(nèi)存閾值在不同的手機上不一樣,一旦低于該值,Android便會殺死對應優(yōu)先級的進程。一旦低于該值,Android便開始按逆序關閉進程。即優(yōu)先級從最高的空進程開始,逆序關閉,直到內(nèi)存足夠。
如何判斷進程的優(yōu)先級?
通過oom_adj 值,判斷進程的優(yōu)先級,不同手機的oom_adj 值可能不一樣。

我們了解這個有什么用呢?PS:了解這個你才能想辦法保證自己怎么不被殺掉。
網(wǎng)上的一些方案和自己認為有用的方案
1 開啟一個像素Activity(偽前臺進程)
在鎖屏的時候在本進程開啟一個Activity,為了欺騙用戶,讓這個Activity的大小是1像素,并且透明無切換動畫,在開屏幕的時候,把這個Activity關閉掉,所以這個就需要監(jiān)聽系統(tǒng)鎖屏廣播。

我們的應用就始終和前臺進程是一樣的優(yōu)先級了,為了省電,系統(tǒng)檢測到鎖屏事件后一段時間內(nèi)會殺死后臺進程,如果采取這種方案,就可以避免了這個問題,但是還是有被殺掉的可能。
Android5.0以下:
Process.killProcessQuiet(pid);
Android5.0以后:
Process.killProcessQuiet(app.pid);
Process.killProcessGroup(app.info.uid, app.pid);
應用退出后,ActivityManagerService不僅把主進程給殺死,另外把主進程所屬的進程組一并殺死,這樣一來,由于子進程和主進程在同一進程組,子進程在做的事情,也就停止了。
2 相互喚醒(廣播喚醒)
相互喚醒的意思就是,假如你手機里裝了支付寶、淘寶、天貓、UC等阿里系的app,那么你打開任意一個阿里系的app后,有可能就順便把其他阿里系的app給喚醒了。這個完全有可能的。此外,開機,網(wǎng)絡切換、拍照、拍視頻時候,利用系統(tǒng)產(chǎn)生的廣播也能喚醒app,不過Android N已經(jīng)將這三種廣播取消了。
3 JobSheduler機制?;睿ú煌扑])
JobSheduler是作為進程死后復活的一種手段,native進程方式最大缺點是費電, Native 進程費電的原因是感知主進程是否存活有兩種實現(xiàn)方式,在 Native 進程中通過死循環(huán)或定時器,判斷主進程是否存活,當主進程不存活時進行拉活。其次5.0以上系統(tǒng)不支持。? 但是JobSheduler可以替代在Android5.0以上native進程方式,這種方式即使用戶強制關閉,部分廠商手機(如:華為)也能被拉起來,但AndroidN失效。
4 粘性服務&與系統(tǒng)服務捆綁()
這個是系統(tǒng)自帶的,onStartCommand方法必須具有一個整形的返回值,這個整形的返回值用來告訴系統(tǒng)在服務啟動完畢后。Service的onStartCommand方法里返回 STATR_STICK,onDestory中start自啟(準確的將算不上進程拉活,只能算service自啟,force_stop后不能正常拉活)。
5 監(jiān)聽第三方app開放的靜態(tài)廣播(同2)
需要大量反編譯app去找開放的靜態(tài)廣播,而且不保證長期有效,可能第三方開放廣播在版本升級時改為私有廣播,如果自己公司有多個app,可廣播互相拉起。
6 NDK+Socket通過fork實現(xiàn)進程?;罘桨福ǎ?/b>
實現(xiàn)進程守護實際是守護app的主要服務,當app主進程被系統(tǒng)kill時,主要服務也會殺死,守護進程將其喚醒。
實現(xiàn)原理圖:

進程?;罘桨刚{研結果
未能實現(xiàn)真正意義上的進程?;睢?/b>
光從?;钸@一點來說,綁定一個像素activity和循環(huán)一個無聲的聲音這種方法比較好,但是對用戶來說太流氓了,不推薦。? 對于有硬性需求的,可以引導用戶加入白名單。至于推送,? 可以嘗試集成多個推送方案,小米,華為等都有推送sdk,在對應手機上可以確保收到消息,? 然后像百度這種是多app公用通道的,也就是手機中有一個使用百度推送的app被允許后臺啟動,就能讓其他app收到推送。隨著Android版本的不斷更新及國內(nèi)廠商對ROM的不斷優(yōu)化,如何最大可能的對進程保活,是Android一道需要長期學習/鉆研的學問,也是Android開發(fā)者不得不面對的問題。
引援:http://www.itdecent.cn/p/1c353edf73ba