Android进程优先级提升

来源:互联网 发布:mysql数据库同步 日志 编辑:程序博客网 时间:2024/06/12 00:20

项目有个需求需定时请求后台获取所需数据,开启了service,但当系统的内存不足时, Android系统将根据进程优先级选择杀死一些不太重要的进程,Android提供了前台进程,已启动的服务,可见进程,后台进程,空进程,若像前台activity一样,处于前台进程,优先级最高,最不可能被系统杀死,但是让进程绝对的不杀死,不可能;那就想办法处理为前台进程即可,可以通过Notification来将service设置为前台进程,但是通知栏有Notification图标,想让用不不知情况下,不能有所察觉,改怎么处理呢?下面介绍个方法:

public class LastingService extends Service{    private final static int SERVICE_ID = 1000;    private static final String TAG ="LastingService" ;    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }    public void onCreate() {        super.onCreate();        Log.getLogger(TAG).i(TAG, "onCreate");        handler.postDelayed(runnable, 2000);//每2s执行一次runnable    }    final Handler handler = new Handler();    final Runnable runnable = new Runnable() {        @Override        public void run() {            Log.getLogger(TAG).i(TAG, "service还活着.....");            handler.postDelayed(this, 2000);        }    };    /**     * 让service进行保活,同时通知栏不会出现Notification     * @param intent     * @param flags     * @param startId     * @return     */    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        if (Build.VERSION.SDK_INT<18){            startForeground(SERVICE_ID,new Notification());        }else {            Intent intentInnerService=new Intent(this,LastingInnerService.class);            startService(intentInnerService);            startForeground(SERVICE_ID,new Notification());        }        return super.onStartCommand(intent, flags, startId);    }    //API大于18时    public static class LastingInnerService extends Service{        @Override        public int onStartCommand(Intent intent, int flags, int startId) {            startForeground(SERVICE_ID, new Notification());            stopForeground(true);            stopSelf();            return super.onStartCommand(intent, flags, startId);        }        @Nullable        @Override        public IBinder onBind(Intent intent) {            return null;        }    }    @Override    public void onDestroy() {        super.onDestroy();        Log.getLogger(TAG).i(TAG, "service---over.....");    }}
主要通过启动时处理,和系统版本有关,API<18时,启动前台service时,传入Notification;API>18时,启动相同id的前台service,同时关闭第一个;

打开cmd---------> adb shell -----> dumpsys activity services PackageName;


可以看到LastingService中的 isForeground=true是前台进程,这样他就活力四射,不容易被系统由于内存不足而被杀死;

这里介绍个进程的oom_adj值,这个值是Linux内核分给系统每个进程的一个值,进程的优先级也是根据它决定的:值越小,进程的优先级越高,值越大,进程的优先级越低;如何查看该值呢?首先adb shell#ps查看应用的PID
然后#cat  /proc/PID/oom_adj的结果就是。

1.ps | grep PackageName //获取你指定的进程信息

2.cat /proc/进程ID/oom_adj


执行2指令需要root条件才可以,后面找个手机root下,

原创粉丝点击