关于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被拉起的现象