安卓手机里的游戏或APP只要手机在”锁屏或息屏”状态后都会停止运行,重新亮屏后往往会看到运行的APP要么是重新开始和游戏重新登录等等;那么安卓系统的手机怎么让手游或APP一直在后台运行(非刷新)?下面做一个简单的代码辅助;以下方法目前对H5游戏大多数不适用
备注:保持APP或手游在安卓后台一直运行一般称之为”保活–即保持活动状态”。
声明:网上很多的保活手段,但是不靠谱的居多; 本文只是进行保活知识的推广,不是在教你做永生不死的进程。

保活手段 业界保活手段 通常为:黑色保活,灰色保活,白色保活;
黑色保活:
1 不同的APP进程,用广播相互唤醒,包括利用系统广播进行唤醒
2 常见手段:
1 开机,网络切换,拍照,拍视频等利用系统广播唤醒APP,此场景Google已经意识到,在Android N 取消了 拍照,视频,网络切换的广播
2 接入第三方的SDK也会唤醒相应的APP进程
3 假如你手机里装了支付宝,淘宝,UC等阿里系的APP,那么你打开任何一个,都有可能唤醒其他的阿里系的APP
白色保活:
就是调用系统的API启动一个前台Service进程,这样会在通知栏生成一个Notification,用户知道哪些进程正在运行
灰色保活:
1 保活领域应用最为广泛,利用系统的漏洞来启动一个前台的Service进程,与“白色保活”不同的是,它不会在通知栏生成一个Notification,用户无法察觉,但是优先级要高于普通的后台进程。
2 实现思路
思路一:当API<18,启动前台的Service直接传入new Notification();
思路二:当API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理

代码这样写:
import android.app.Notification;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
/**
- APP灰色保活 */
public class GrayService extends Service {
private final static int GRAY_SERVICE_ID = 1001;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//API < 18,此方法能有效地隐藏notification的图标
if (Build.VERSION.SDK_INT < 18) {
startForeground(GRAY_SERVICE_ID, new Notification());
} else {
Intent intent1 = new Intent(this, GrayInnerService.class);
startService(intent1);
startForeground(GRAY_SERVICE_ID, new Notification());
}
return super.onStartCommand(intent, flags, startId);
}
//给API >= 18 的平台上作灰色保护手段
public class GrayInnerService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
startForeground(GRAY_SERVICE_ID, new Notification());
stopForeground(true);
stopSelf();
return super.onStartCommand(intent, flags, startId);
}
}
}
3 检验方法:
首先看系统通知栏有没有Notification,若是没有,就进入手机adb shell模式,输入命令dumpsys activity services PackageName
打印出指定包名的全部进程中的service信息,看下有没有isForground=true的信息,若是有,就说明了该APP使用了灰色保活
4 使用灰色保活手段并不意味着你的应用就能永生不死,只能说提升了进程的优先级,若是应用占用了很大的内存,仍是会被回收的
进一步理解保活
1 进程回收机制
系统出于体验和性能上的考虑,APP在退出后台时系统并不会真正的kill掉这个进程,而是将其缓存起来,打开的应用越多,后台缓存的进程也就越多。在系统内存不足的状况下,系统开始根据自身的一套进程回收机制来判断要回收掉哪些进程,这套杀死进程回收内存的机制叫 Low Memory Killer,它是基于Linux内核的OOM killer机制诞生的,该机制为每一个系统分配了一个值,叫作oom_adj,表明了进程的优先级,oom_adj越大,表明优先级越低,越容易被回收,普通APP进程的oom_adj >=0,系统的可能会小于0.
2 查看oom_adj的值,须要用到两个shell命令
ps | grep 包名
$cat /proc/进程id/oom_adj
3 结果发现,APP推到后台,UI进程的值下降最为明显,由于它占用的内存资源最多,所以,为了不后台UI进程被杀,须要尽量的释放一些不用的图片,音频资源