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下,