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

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的生命周期过于短暂, 也决定了不能在其中执行耗时操作).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: