项目有个需求需定时请求后台获取所需数据,开启了service,但当系统的内存不足时, Android系统将根据进程优先级选择杀死一些不太重要的进程,Android提供了前台进程,已启动的服务,可见进程,后台进程,空进程,若像前台activity一样,处于前台进程,优先级最高,最不可能被系统杀死,但是让进程绝对的不杀死,不可能;那就想办法处理为前台进程即可,可以通过Notification来将service设置为前台进程,但是通知栏有Notification图标,想让用不不知情况下,不能有所察觉,改怎么处理呢?下面介绍个方法:
public class LastingService extends Service{主要通过启动时处理,和系统版本有关,API<18时,启动前台service时,传入Notification;API>18时,启动相同id的前台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.....");
}
}
打开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下,