目的
進(jìn)程保活是各個(gè)公司想要實(shí)現(xiàn)的一個(gè)功能帽撑,可以“無賴”地一直霸占你的手機(jī)泼各,不被系統(tǒng)和第三方殺掉,以下是幾種方案亏拉,供大家參考扣蜻,具體實(shí)現(xiàn)還需自己完成逆巍。
基本思路
- 提升進(jìn)程優(yōu)先級(jí),防止被殺掉
- 進(jìn)程被殺掉之后進(jìn)行拉活
進(jìn)程優(yōu)先級(jí)劃分
1.前臺(tái)進(jìn)程
- 用戶正在交互的Activity
- 當(dāng)某個(gè)Service綁定正在交互的Activity
- 被主動(dòng)調(diào)用的前臺(tái)Service(startForeground)
- 組件正在執(zhí)行生命周期的回調(diào)(onCreate/onStart/onDestroy)
- BroadcastReceive正在執(zhí)行onReceive()
2.可見進(jìn)程
- Activity處于onPause狀態(tài)
3.服務(wù)進(jìn)程
- 通過startService啟動(dòng)的service
4.后臺(tái)進(jìn)程
- Activity處于onStop狀態(tài)
5.空進(jìn)程
- 不含有任何四大組件的進(jìn)程
Android 進(jìn)程回收策略
Android 中對(duì)于內(nèi)存的回收弱贼,主要依靠 Lowmemorykiller 來完成蒸苇,是一種根據(jù) OOM_ADJ 閾值級(jí)別觸發(fā)相應(yīng)力度的內(nèi)存回收的機(jī)制。
關(guān)于 OOM_ADJ 的說明如下:
image.png
其中紅色部分代表比較容易被殺死的 Android 進(jìn)程(OOM_ADJ>=4),綠色部分表示不容易被殺死的 Android 進(jìn)程吮旅,其他表示非 Android 進(jìn)程(純 Linux 進(jìn)程)溪烤。在 Lowmemorykiller 回收內(nèi)存時(shí)會(huì)根據(jù)進(jìn)程的級(jí)別優(yōu)先殺死 OOM_ADJ 比較大的進(jìn)程,對(duì)于優(yōu)先級(jí)相同的進(jìn)程則進(jìn)一步受到進(jìn)程所占內(nèi)存和進(jìn)程存活時(shí)間的影響庇勃。
進(jìn)程泵枢郑活方案
1.提升進(jìn)程優(yōu)先級(jí)
- 監(jiān)聽手機(jī)的屏幕的解鎖和鎖屏事件,在手機(jī)鎖屏?xí)r啟動(dòng)1像素的Activity责嚷,解鎖時(shí)結(jié)束1像素的Activity
- 通過startForeground()提升到前臺(tái)進(jìn)程
2.雙進(jìn)程守護(hù)
- 開AB兩個(gè)進(jìn)程鸳兽,互相監(jiān)聽,當(dāng)A進(jìn)程被殺死罕拂,B進(jìn)程重新啟動(dòng)A進(jìn)程
3.其他
- 使用JobScheduler揍异,將任務(wù)添加進(jìn)系統(tǒng)調(diào)度隊(duì)列
- 將Service中onStartCommand的返回值設(shè)置為START_STICKY
- 利用BroadcastRecelver,監(jiān)聽系統(tǒng)的廣播或第三方應(yīng)用發(fā)出的廣播
- 針對(duì)性的接入第三方推送爆班,比如小米渠道下接入小米推送衷掷,華為渠道下接入華為推送,墻外App接入GCM
- 利用賬號(hào)同步機(jī)制柿菩,系統(tǒng)會(huì)定期喚醒賬戶更新服務(wù)
- 通過各種手段加入手機(jī)系統(tǒng)的白名單
總結(jié)
現(xiàn)在手機(jī)對(duì)進(jìn)程逼菪幔活的問題做的越來越嚴(yán)格,所以有很多方法并不見效枢舶,本人也是不支持做項(xiàng)目的進(jìn)程迸嘲活。試想如果每一個(gè)APP項(xiàng)目都進(jìn)程绷剐梗活躏尉,霸占你的手機(jī)內(nèi)存,手機(jī)就會(huì)變得炒雞卡旧困,到頭來難受的還是我們用戶自己呀醇份。