您的位置:首页 > 移动开发

如何让安卓APP一直在后台运行?

2016-04-23 10:30 429 查看

本文摘自微信公众号“android高心星的私塾”

    一  声明

        1 网上很多的保活手段,但是不靠谱的居多

        2 本文只是进行保活知识的推广,不是在教你做永生不死的进程

    二  保活手段

        1 业界保活手段:黑色保活,灰色保活,白色保活

        2 黑色保活:

            1  不同的APP进程,用广播相互唤醒,包括利用系统广播进行唤醒

            2  常见手段:

             
      1 开机,网络切换,拍照,拍视频等利用系统广播唤醒APP

             
          此场景Google已经意识到,在Android N 取消了 拍照,视频,网络切换的广播

             
      2 接入第三方的SDK也会唤醒相应的APP进程

             
      3 假如你手机里装了支付宝,淘宝,UC等阿里系的APP,那么你打开任何一个,都有可能唤醒其他的阿里系的APP

        3 白色保活:

             就是调用系统的API启动一个前台Service进程,这样会在通知栏生成一个Notification,用户知道哪些进程正在运行

        4 灰色保活

            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灰色保活
* Created by fflin on 2016/4/23.
*/
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进程被杀,需要尽可能的释放一些不用的图片,音频资源   
 

             
     

             
  

       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: