參考:http://www.reibang.com/p/63aafe3c12af#
現(xiàn)在APP有這樣一個(gè)需求:當(dāng)APP縮后臺(tái)后,轉(zhuǎn)去使用其他APP寡夹,再回來的時(shí)候APP是重新啟動(dòng)!現(xiàn)在要做的是盡量避免這個(gè)事情昭殉!
What
問題出現(xiàn)于現(xiàn)有App內(nèi)有一個(gè)開屏頁雏婶,也就是每次進(jìn)入都會(huì)有的那個(gè)閃屏頁。那么就有兩個(gè)思路室梅,一個(gè)是把開屏頁去掉!一個(gè)是提升APP的存活時(shí)間疚宇,也就是使APP的回收級(jí)別提高亡鼠!
How
提升APP存活時(shí)間大致有三種方法:1、黑色被壹担活拆宛,2、白色彼先觯活浑厚,3股耽、灰色保活:
黑色鼻活:利用不同的APP之間進(jìn)行廣播喚醒物蝙,可以使第三方APP也可以是系統(tǒng)的APP
白色保活:啟動(dòng)前臺(tái)Service
灰色备壹瑁活:利用系統(tǒng)的漏洞啟動(dòng)前臺(tái)Service
黑色蔽芷颍活
1、開機(jī)钠导、網(wǎng)絡(luò)切換震嫉、拍照、拍視頻的廣播喚醒a(bǔ)pp牡属,但是從Android N取消了拍照票堵、拍視頻、網(wǎng)絡(luò)切換等廣播逮栅。而開機(jī)廣播再有的第三方rom也去掉了悴势。
2、接入SDK喚醒a(bǔ)pp措伐。比如你介入了微信sdk會(huì)喚醒微信特纤,支付寶sdk會(huì)喚醒支付寶〗募樱或者有的推送sdk也會(huì)喚醒a(bǔ)pp捧存。
3、其他app喚起同家公司app官硝。比如矗蕊,騰訊系app喚醒騰訊系其他產(chǎn)品短蜕。
白色鼻饧埽活
啟動(dòng)前臺(tái)的Service進(jìn)程。也就是說在迸竽В活的進(jìn)程中啟動(dòng)一個(gè)Service岖研,然后Service中啟動(dòng)一個(gè)通知Noification,比如QQ音樂警检,360通知欄等等孙援。
灰色保活
也是啟動(dòng)一個(gè)前臺(tái)的Service進(jìn)程扇雕,但是與普通的啟動(dòng)方式區(qū)別在于拓售,通知欄不會(huì)出現(xiàn)一個(gè)Notification,看起來就如同運(yùn)行著一個(gè)后臺(tái)Service進(jìn)程一樣镶奉。這樣的話就使得自身進(jìn)程優(yōu)先級(jí)高于普通后臺(tái)進(jìn)程的础淤。
具體可參考原文:http://www.reibang.com/p/63aafe3c12af#
再者說為什么QQ進(jìn)程不死崭放,我也曾認(rèn)為存在這樣一種技術(shù)「胄祝可惜我把手機(jī)root后币砂,殺掉QQ進(jìn)程之后就再也起不來了。有些手機(jī)廠商把這些知名的app放入了自己的白名單中玻侥,保證了進(jìn)程不死來提高用戶體驗(yàn)(如微信决摧、QQ、陌陌都在小米的白名單中)凑兰。如果從白名單中移除掌桩,他們終究還是和普通app一樣躲避不了被殺的命運(yùn),為了盡量避免被殺姑食,還是老老實(shí)實(shí)去做好優(yōu)化工作吧拘鞋。
Why
首先進(jìn)程回收是有個(gè)優(yōu)先級(jí)的,優(yōu)先級(jí)從高到低是:
- 前臺(tái)進(jìn)程(Foreground Process)
- 可視進(jìn)程(Visible Process)
- 服務(wù)進(jìn)程(Service Process)
- 后臺(tái)進(jìn)程(Background Process)
- 空進(jìn)程(Empty Process)
熟悉Android系統(tǒng)的童鞋都知道矢门,系統(tǒng)出于體驗(yàn)和性能上的考慮盆色,app在退到后臺(tái)時(shí)系統(tǒng)并不會(huì)真正的kill掉這個(gè)進(jìn)程,而是將其緩存起來祟剔。打開的應(yīng)用越多隔躲,后臺(tái)緩存的進(jìn)程也越多。在系統(tǒng)內(nèi)存不足的情況下物延,系統(tǒng)開始依據(jù)自身的一套進(jìn)程回收機(jī)制來判斷要kill掉哪些進(jìn)程宣旱,以騰出內(nèi)存來供給需要的app。這套殺進(jìn)程回收內(nèi)存的機(jī)制就叫 Low Memory Killer 叛薯,它是基于Linux內(nèi)核的 OOM Killer(Out-Of-Memory killer)機(jī)制誕生浑吟。
其他方法的一些參考
https://www.zhihu.com/question/29826231
把你的應(yīng)用做到QQ那么大,那么有用戶需求耗溜,不需要流氓组力,所有的工具軟件都會(huì)把它加入白名單。
1抖拴、Service設(shè)置成START_STICKY燎字,kill 后會(huì)被重啟(等待5秒左右),重傳Intent阿宅,保持與重啟前一樣
2候衍、通過 startForeground將進(jìn)程設(shè)置為前臺(tái)進(jìn)程,做前臺(tái)服務(wù)洒放,優(yōu)先級(jí)和前臺(tái)應(yīng)用一個(gè)級(jí)別?蛉鹿,除非在系統(tǒng)內(nèi)存非常缺,否則此進(jìn)程不會(huì)被 kill(本文類似方法)
3往湿、雙進(jìn)程Service:讓2個(gè)進(jìn)程互相保護(hù)妖异,其中一個(gè)Service被清理后惨好,另外沒被清理的進(jìn)程可以立即重啟進(jìn)程
4、QQ黑科技:在應(yīng)用退到后臺(tái)后随闺,另起一個(gè)只有 1 像素的頁面停留在桌面上日川,讓自己保持前臺(tái)狀態(tài),保護(hù)自己不被后臺(tái)清理工具殺死
5矩乐、在已經(jīng)root的設(shè)備下龄句,修改相應(yīng)的權(quán)限文件,將App偽裝成系統(tǒng)級(jí)的應(yīng)用(Android4.0系列的一個(gè)漏洞散罕,已經(jīng)確認(rèn)可行)
6分歇、Android系統(tǒng)中當(dāng)前進(jìn)程(Process)fork出來的子進(jìn)程,被系統(tǒng)認(rèn)為是兩個(gè)不同的進(jìn)程欧漱。當(dāng)父進(jìn)程被殺死的時(shí)候职抡,子進(jìn)程仍然可以存活,并不受影響误甚。鑒于目前提到的在Android-Service層做雙守護(hù)都會(huì)失敗缚甩,我們可以fork出c進(jìn)程,多進(jìn)程守護(hù)窑邦。死循環(huán)在那檢查是否還存在擅威,具體的思路如下(Android5.0以下可行聽說耗電量增加):①用C編寫守護(hù)進(jìn)程(即子進(jìn)程),守護(hù)進(jìn)程做的事情就是循環(huán)檢查目標(biāo)進(jìn)程是否存在冈钦,不存在則啟動(dòng)它郊丛。②在NDK環(huán)境中將1中編寫的C代碼編譯打包成可執(zhí)行文件(BUILD_EXECUTABLE)。③主進(jìn)程啟動(dòng)時(shí)將守護(hù)進(jìn)程放入私有目錄下瞧筛,賦予可執(zhí)行權(quán)限厉熟,啟動(dòng)它即可。
7较幌、聯(lián)系廠商揍瑟,加入白名單