android中进程优先级
2016-07-20 12:01
323 查看
之前被问到 如果系统的资源不足,导致一些进程要被 Kill 掉,那么他们被杀死的先后顺序是怎么样的
这里具体的说一下 优先级顺序由低到高:
1. 空进程:
是指不包含任何处于活动状态(比如四大组件)的进程,那么它存在的意义是什么? 它是缓存一些启动数据, 方便下一次启动程序。这只是我浅的理解,如果有其他有关空进程的理解, 请多多指教。
2. 后台进程:
包含不可见的activity,在activity的生命周期中,用户不可见即处于 onstop()方法调用后,系统为了保证优先级更高的进程的运行,随时可能杀死一个后台进程。对于其生命周期, activity处于这个状态还可以被重新启动。
3. 服务进程:
包含已经启动的service,所以,如果在service中执行比较耗时的操作,不能保证一定能执行完毕。
4. 可见进程:
可见进程分为以下两种情况:
(1)进程包含未处于前台但是可见的activity ,对应于生命周期的 调用了 onpause()方法,但是没有调用 ondestory()方法,例如,运行activity时弹出对话框。
(2)进程中包含与可见activity绑定的service
5. 前台进程:
前台进程分为以下5中情况:
(1)进程中包含正与用户交互的activity
(2)进程中包含与前台activity绑定的service
(3)进程中包含正在执行oncreate() onstart() 或者ondestory()方法的service
(4)进程中包含调用了 startForeground()方法的service 这里简单说一下startForeground()这个方法,这是避免后台运行的服务被强行杀死。在onstartCommand()里调用startForeground()方法让服务前台运行,最后在 ondestory()方法里调用 stopForeground()方法去掉。
(5)进程中包含正在执行 onReceive()方法的BroadcastReceiver。
其实在系统中,前台进程的数量很少,前台进程几乎不会被杀死。
注意:
如果一个进程包含多个优先级的活动组件,那么该进程按优先级最高的对待。比如说,一个进程包含已经启动的service,也包含前台activity,那么这个进程就被看做是前台进程。
由于组件之间的依赖性, 进程的优先级有可能被提高. 假如进程A服务于进程B, 则进程A的优先级不能低于进程B. 比如, 进程A的ContentProvider组件正在服务于进程B的某个组件, 或者进程A的service组件和进程B的某个组件绑定等, 这些情况下, 进程A的优先级都不会低于进程B(如果按照优先级规则, 进程A的优先级确实低于进程B, 则系统会选择提高进程A的优先级到和进程B相同).
由于服务进程的优先级高于后台进程, 因此如果activity需要执行耗时操作, 最好还是启动一个service来完成. 当然, 在activity中启动子线程完成耗时操作也可以, 但是这样做的缺点在于, 一旦activity不再可见, activity所在的进程成为后台进程, 而内存不足时后台进程随时都有可能被系统杀死(但是启动service完成耗时操作会带来数据交互的问题, 比如耗时操作需要实时更新UI控件的状态的话, service就不是一个好的选择). 基于同样的考虑, 在BroadcastReceiver中也不应该执行耗时操作,
而应该启动service来完成(当然, BroadcastReceiver的生命周期过于短暂, 也决定了不能在其中执行耗时操作).
这里具体的说一下 优先级顺序由低到高:
1. 空进程:
是指不包含任何处于活动状态(比如四大组件)的进程,那么它存在的意义是什么? 它是缓存一些启动数据, 方便下一次启动程序。这只是我浅的理解,如果有其他有关空进程的理解, 请多多指教。
2. 后台进程:
包含不可见的activity,在activity的生命周期中,用户不可见即处于 onstop()方法调用后,系统为了保证优先级更高的进程的运行,随时可能杀死一个后台进程。对于其生命周期, activity处于这个状态还可以被重新启动。
3. 服务进程:
包含已经启动的service,所以,如果在service中执行比较耗时的操作,不能保证一定能执行完毕。
4. 可见进程:
可见进程分为以下两种情况:
(1)进程包含未处于前台但是可见的activity ,对应于生命周期的 调用了 onpause()方法,但是没有调用 ondestory()方法,例如,运行activity时弹出对话框。
(2)进程中包含与可见activity绑定的service
5. 前台进程:
前台进程分为以下5中情况:
(1)进程中包含正与用户交互的activity
(2)进程中包含与前台activity绑定的service
(3)进程中包含正在执行oncreate() onstart() 或者ondestory()方法的service
(4)进程中包含调用了 startForeground()方法的service 这里简单说一下startForeground()这个方法,这是避免后台运行的服务被强行杀死。在onstartCommand()里调用startForeground()方法让服务前台运行,最后在 ondestory()方法里调用 stopForeground()方法去掉。
(5)进程中包含正在执行 onReceive()方法的BroadcastReceiver。
其实在系统中,前台进程的数量很少,前台进程几乎不会被杀死。
注意:
如果一个进程包含多个优先级的活动组件,那么该进程按优先级最高的对待。比如说,一个进程包含已经启动的service,也包含前台activity,那么这个进程就被看做是前台进程。
由于组件之间的依赖性, 进程的优先级有可能被提高. 假如进程A服务于进程B, 则进程A的优先级不能低于进程B. 比如, 进程A的ContentProvider组件正在服务于进程B的某个组件, 或者进程A的service组件和进程B的某个组件绑定等, 这些情况下, 进程A的优先级都不会低于进程B(如果按照优先级规则, 进程A的优先级确实低于进程B, 则系统会选择提高进程A的优先级到和进程B相同).
由于服务进程的优先级高于后台进程, 因此如果activity需要执行耗时操作, 最好还是启动一个service来完成. 当然, 在activity中启动子线程完成耗时操作也可以, 但是这样做的缺点在于, 一旦activity不再可见, activity所在的进程成为后台进程, 而内存不足时后台进程随时都有可能被系统杀死(但是启动service完成耗时操作会带来数据交互的问题, 比如耗时操作需要实时更新UI控件的状态的话, service就不是一个好的选择). 基于同样的考虑, 在BroadcastReceiver中也不应该执行耗时操作,
而应该启动service来完成(当然, BroadcastReceiver的生命周期过于短暂, 也决定了不能在其中执行耗时操作).
相关文章推荐
- Android Textview动态改变drawable
- Android 游戏编程
- Edittext密码与显示状态切换
- android studio导入项目下载gradle-x.x.x-all.zip 放那个文件夹目录
- 完善继承HorizontalScrollView做的SlidingMenu
- ANDROID应用性能调优的技术点
- 关于APK瘦身值得分享的一些经验
- android ColorMatrix常用图像颜色矩阵处理效果
- Plugin is too old, please update to a more recent version错误
- 关于touch事件分发
- Android资源代码 源码 整理 Github开源项目下载地址
- Android view 详解(一)LayoutInflater
- 多段合并播放器方案(移动版)
- Android基于Pull方式解析xml的方法详解
- android事件分发机制解析(配流程图)
- 给 Android 开发者的 RxJava 详解
- Android APK反编译就这么简单 详解(附图)
- H5通过input直接调用android摄像头
- Android Studio如何导入工程
- Introduction to Android Espresso