android java进程管理(七)之进程状态和adj值

来源:互联网 发布:乐视视频怎么设置数据 编辑:程序博客网 时间:2024/06/06 02:19

进程的状态和adj值用来定义进程的重要性,如何体现这种重要性?我们知道进程是用来运行组件的,所以组件的重要性就相当于进程的重要性,进程状态和adj值需要以组件的状态为核心来理解。

进程状态

android系统定义的进程状态很简单,仅仅是简单描述一下组件的运行信息

状态描述:
1.PROCESS_STATE_NONEXISTENT:进程运行实体还不存在
2.PROCESS_STATE_PERSISTENT:常驻内存进程
3.PROCESS_STATE_PERSISTENT_UI:常驻内存进程并且有UI显示
4.PROCESS_STATE_TOP:顶端进程,包含顶端activity
5.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:系统绑定了本进程的一个Service组件
6.PROCESS_STATE_FOREGROUND_SERVICE:进程正在运行前台Service组件
7.PROCESS_STATE_TOP_SLEEPING:顶端进程,手机处于锁屏状态
8.PROCESS_STATE_IMPORTANT_FOREGROUND:前台重要进程
9.PROCESS_STATE_IMPORTANT_BACKGROUND:后台重要进程
10.PROCESS_STATE_BACKUP:正在执行备份还原的进程
11.PROCESS_STATE_HEAVY_WEIGHT:重量级进程
12.PROCESS_STATE_SERVICE:进程正在运行Service组件
13.PROCESS_STATE_RECEIVER:进程正在运行广播接收器
14.PROCESS_STATE_HOME:home进程
15.PROCESS_STATE_LAST_ACTIVITY:包含上一个显示Activity的进程
16.PROCESS_STATE_CACHED_ACTIVITY:缓存Activity的进程
17.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:这个进程持有16进程组件的客户端
18.PROCESS_STATE_CACHED_EMPTY:空进程

第1个状态不是一个完整的进程,其他的进程状态是值越小越重要,那么大家是不是有点困惑?四大组件中不是Activity最重要吗?为什么15 16 17 的进程比12 13 的进程的重要性要低呢?这里边还有一个运行的概念,运行的一定比不运行的重要,12 13 都是正在运行的Service组件和广播接收器组件,而15 16 17 仅是指存在Activity,所以12 13 的重要性要高,区分一个进程的重要性从下面几个层次来看:

  • 1.是不是常驻内存进程
  • 2.是不是处于运行的状态
  • 3.组件的重要性:Activity>Service>广播接收器

adj值

这个值是给lmk(lowmemorykiller)子系统使用的,lmk是android提供的进程内存管理的子系统,这个系统有点黑,采用直接kill进程的方式回收内存,属于相当暴力的方式,所以对adj的值计算需要小心为妙,否则进程动不动被kill就不好了,android系统定义了如下级别的adj值

adj值描述:
1.NATIVE_ADJ:本地进程的adj值,不受AMS的管理
2.SYSTEM_ADJ:system_server进程的adj值
3.PERSISTENT_PROC_ADJ:常驻内存进程的adj值
4.PERSISTENT_SERVICE_ADJ:这种进程含有一个Service组件,这个组件被系统进程或者常驻内存进程绑定了
5.FOREGROUND_APP_ADJ:前台进程
6.VISIBLE_APP_ADJ:可见进程(进程包含的Activity可见)
7.PERCEPTIBLE_APP_ADJ:用户可感受的进程,什么是可感受?看是一种感受,听也是一种感受,比如后台运行的音乐播放器就是听觉感受,它就属于这类进程
8.BACKUP_APP_ADJ:运行备份还原的进程
9.HEAVY_WEIGHT_APP_ADJ:重量级进程
10.SERVICE_ADJ:含有Service组件的进程
11.HOME_APP_ADJ:home进程
12.PREVIOUS_APP_ADJ:前一个进程
13.SERVICE_B_ADJ:B list Service
14.CACHED_APP_MIN_ADJ:缓存Activity的进程
15.CACHED_APP_MAX_ADJ:缓存Activity的进程
16.UNKNOWN_ADJ:adj值不确定的进程
17.INVALID_ADJ:无效的adj

以上是目前android系统定义的adj值,每一个进程都会赋予一个adj值,越往下进程越不重要,越容易被kill掉
大家有没有发现,adj表面上来看好像没有广播接收器的事呢?其实在第5个(FOREGROUND_APP_ADJ)adj值中都包括了,这个前台进程在这里定义的很广泛,不只是包含top Activity,而且只要进程包含运行Service组件或者正在执行广播接收器,都看作是前台进程,重要性也就很高,adj值的确定的基本准则也适用上面三条:

  • 1.是不是常驻内存进程
  • 2.是不是处于运行的状态
  • 3.组件的重要性:Activity>Service>广播接收器

更新lru容器

更新进程状态和adj值

0 0
原创粉丝点击