怎么让安卓手机后台一直运行游戏或APP?

安卓手机里的游戏或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进程被杀,须要尽量的释放一些不用的图片,音频资源