您的位置:首页 > 移动开发 > Android开发

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

2017-05-01 09:21 288 查看
进程的状态和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值

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: