關於android進程:
1.前臺進程(Foreground process)
2、可見進程
3、服務進程
4、空進程
要避免被回收,首先就要提高進程級別。
在Android中,即使當用戶退出應用程序之後,應用程序的進程也還是存在於系統中,這樣是爲了方便程序的再次啓動,但是這樣的話,隨着打開的程序數量的增加,系統的內存會變得不足,就需要殺掉一部分進程以釋放內存空間。至於是否需要殺死一些進程和哪些進程需要被殺死,是通過Low Memory Killer機制來進行判定的。
1、oom_adj
oom_adj 的值越小, 就越不容易被後臺回收
static final int PERCEPTIBLE_APP_ADJ = 2;
// This is a process only hosting activities that are visible to the
// user, so we'd prefer they don't disappear.
// ZMS:此進程僅僅擁有用戶可見的Activity,所以我們不希望它消失。
static final int VISIBLE_APP_ADJ = 1;
// This is the process running the current foreground app. We'd really
// rather not kill it!
// ZMS:前臺應用進程。最好不要殺掉它!
static final int FOREGROUND_APP_ADJ = 0;
所以爲了能夠在後臺鎖屏情況下,對於一些特殊應用,比如記錄軌跡, 爲了使APP不被殺死,應當儘量減少oom_adj的值
查看oom_adj :
adb shell
ps yourapp.package.name // get the pid
cat /proc/pid_value/oom_adj
2、內存、電量
在後臺,當多個app 的 oom_adj 值保持爲一致的時候 , 部分手機廠商會根據內存和電量使用情況對app進行回收。 目標就是內存越小越好、電量越低越好
電量優化: 1、減少wake lock 喚醒 2、減少alarm的喚醒 參考: Android應用的電量消耗和優化的策略
3、與廠商合作, 進入白名單
4、關於拉活
a. jobService 在android5.0以上的機型 ,測試過部分機型,使可以拉活的, 小米、華爲測試需要開啓後臺啓動權限後,才能正常拉活
JobService和JobScheduler機制在Android5.0以上保活
b. accountSyncManager 幾乎大部分機型 基本是都可以實現。但是拉活週期在部分手機上表現不同, 有的需要1小時甚至更久
c、接入第三方通訊SDK, 可以實現application被拉起的現象