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下,
阅读全文
0 0
- Android进程优先级提升
- android 进程优先级
- android 进程优先级
- android 进程优先级
- android 进程优先级
- android 进程的优先级
- Android 进程优先级
- android 进程优先级
- Android笔记进程优先级
- android进程优先级
- android 进程优先级
- android进程优先级
- Android的进程优先级
- Android中进程优先级
- android 进程优先级
- Android中的进程优先级
- android 进程优先级
- Android进程优先级详解
- Android 的进阶知识点之一Activity 的4种启动模式
- Android 6.0 运行时权限申请
- 面试题9:斐波那契数列
- 一招处理java并发?
- 软件测试理论与技巧
- Android进程优先级提升
- 遍历数组(对象)
- 冒泡排序四种写法
- 查找某个目录下包含有某个关键字的所有文件夹以及子文件夹里的文件名
- 使用Nginx配置反向代理服务器
- 关于视频相关协议的分析
- Vue.js 官方文档摘记 class和style绑定
- HttpServletRequest对象
- mac 下配置lnmp