參考:http://www.lxweimin.com/p/63aafe3c12af#
現在APP有這樣一個需求:當APP縮后臺后,轉去使用其他APP,再回來的時候APP是重新啟動!現在要做的是盡量避免這個事情!
What
問題出現于現有App內有一個開屏頁,也就是每次進入都會有的那個閃屏頁。那么就有兩個思路,一個是把開屏頁去掉!一個是提升APP的存活時間,也就是使APP的回收級別提高!
How
提升APP存活時間大致有三種方法:1、黑色保活,2、白色保活,3、灰色保活:
黑色保活:利用不同的APP之間進行廣播喚醒,可以使第三方APP也可以是系統的APP
白色保活:啟動前臺Service
灰色保活:利用系統的漏洞啟動前臺Service
黑色保活
1、開機、網絡切換、拍照、拍視頻的廣播喚醒app,但是從Android N取消了拍照、拍視頻、網絡切換等廣播。而開機廣播再有的第三方rom也去掉了。
2、接入SDK喚醒app。比如你介入了微信sdk會喚醒微信,支付寶sdk會喚醒支付寶。或者有的推送sdk也會喚醒app。
3、其他app喚起同家公司app。比如,騰訊系app喚醒騰訊系其他產品。
白色保活
啟動前臺的Service進程。也就是說在保活的進程中啟動一個Service,然后Service中啟動一個通知Noification,比如QQ音樂,360通知欄等等。
灰色保活
也是啟動一個前臺的Service進程,但是與普通的啟動方式區別在于,通知欄不會出現一個Notification,看起來就如同運行著一個后臺Service進程一樣。這樣的話就使得自身進程優先級高于普通后臺進程的。
具體可參考原文:http://www.lxweimin.com/p/63aafe3c12af#
再者說為什么QQ進程不死,我也曾認為存在這樣一種技術。可惜我把手機root后,殺掉QQ進程之后就再也起不來了。有些手機廠商把這些知名的app放入了自己的白名單中,保證了進程不死來提高用戶體驗(如微信、QQ、陌陌都在小米的白名單中)。如果從白名單中移除,他們終究還是和普通app一樣躲避不了被殺的命運,為了盡量避免被殺,還是老老實實去做好優化工作吧。
Why
首先進程回收是有個優先級的,優先級從高到低是:
- 前臺進程(Foreground Process)
- 可視進程(Visible Process)
- 服務進程(Service Process)
- 后臺進程(Background Process)
- 空進程(Empty Process)
熟悉Android系統的童鞋都知道,系統出于體驗和性能上的考慮,app在退到后臺時系統并不會真正的kill掉這個進程,而是將其緩存起來。打開的應用越多,后臺緩存的進程也越多。在系統內存不足的情況下,系統開始依據自身的一套進程回收機制來判斷要kill掉哪些進程,以騰出內存來供給需要的app。這套殺進程回收內存的機制就叫 Low Memory Killer ,它是基于Linux內核的 OOM Killer(Out-Of-Memory killer)機制誕生。
其他方法的一些參考
https://www.zhihu.com/question/29826231
把你的應用做到QQ那么大,那么有用戶需求,不需要流氓,所有的工具軟件都會把它加入白名單。
1、Service設置成START_STICKY,kill 后會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣
2、通過 startForeground將進程設置為前臺進程,做前臺服務,優先級和前臺應用一個級別?,除非在系統內存非常缺,否則此進程不會被 kill(本文類似方法)
3、雙進程Service:讓2個進程互相保護,其中一個Service被清理后,另外沒被清理的進程可以立即重啟進程
4、QQ黑科技:在應用退到后臺后,另起一個只有 1 像素的頁面停留在桌面上,讓自己保持前臺狀態,保護自己不被后臺清理工具殺死
5、在已經root的設備下,修改相應的權限文件,將App偽裝成系統級的應用(Android4.0系列的一個漏洞,已經確認可行)
6、Android系統中當前進程(Process)fork出來的子進程,被系統認為是兩個不同的進程。當父進程被殺死的時候,子進程仍然可以存活,并不受影響。鑒于目前提到的在Android-Service層做雙守護都會失敗,我們可以fork出c進程,多進程守護。死循環在那檢查是否還存在,具體的思路如下(Android5.0以下可行聽說耗電量增加):①用C編寫守護進程(即子進程),守護進程做的事情就是循環檢查目標進程是否存在,不存在則啟動它。②在NDK環境中將1中編寫的C代碼編譯打包成可執行文件(BUILD_EXECUTABLE)。③主進程啟動時將守護進程放入私有目錄下,賦予可執行權限,啟動它即可。
7、聯系廠商,加入白名單