Android进程优先级提升

项目有个需求需定时请求后台获取所需数据,开启了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下,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值