Android-?;?/h2>

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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容