Android中进程生命周期的优先级

 更新时间:2016年01月17日 09:54:27   投稿:hebedich  
这篇文章主要介绍了Android中进程生命周期的优先级的相关资料,需要的朋友可以参考下

学习Android最好的途径当然是强大的官方文档了,其中在Processes and Threads一节中对于进程生命周期淘汰优先级,有着详细的介绍。就不给大家转帖了,直接放译文吧,如下:

Android系统会尽量维持进程的存在,但毕竟资源有限,当系统资源告急的时候会淘汰一部分进程。淘汰顺序的凭据就是系统进程的优先级了,优先级越高越不容易被杀死,反之亦然。系统总共为进程分了五个优先级,如下

一、前台进程(进程满足如下任一条件即为前台进程):

1. 拥有 一个执行了onresume方法正在与用户交互(获得焦点)的Activity
2. 拥有一个service,这个Service跟正在与用户交互的Activity进行了绑定
3. 拥有一个Service,这个Service调用了startForeground()方法
4. 拥有一个正在执行onCreate()、onStart()或者onDestroy()方法中的任意一个的Service
5. 拥有一个正在执行onReceive方法的BroadcastReceiver

二、可见进程:

1. 拥有一个执行了onPause方法,但仍然可见的Activity
2. 拥有一个Service,这个Service跟一个可见的或前台的Activity绑定了

三、服务进程:

拥有一个通过startService方法启动的Service的进程

四、后台进程:

拥有一个后台Activity(onStop方法被调用)的进程

五、空进程:

没有拥有任何活动的应用组件的进程,也就是没有任何Service和Activity在运行

另外,还有一些需要补充的,当一个进程满足多个进程条件时,当然是取优先级更高的为准,比如一个进程同时满足前台进程和服务进程的条件,这个进程就是个前台进程,这点很好理解。另外,进程的优先级也不是一成不变的,而且有时候会随着一些相关的因素而发生改变;比如,某进程A满足前台进程的第二个条件,进程A拥有一个service,这个Service跟正在与用户交互的Activity进行了绑定;当这个Activity变成可见状态了,进程A便不再满足前台进程的条件,进而因满足可见进程的第二个条件,进程A变成了可见进程。总之,在掌握了基本概念之后,需要细心的分析具体的情况,方能得出正确的判断。

进程优先级的额外说明

1. 系统会赋予进程尽可能高的优先级. 例如一个进程既包含已启动的service, 也包含前台activity, 则这个进程会被视为前台进程.

2. 由于组件之间的依赖性, 进程的优先级有可能被提高. 假如进程A服务于进程B, 则进程A的优先级不能低于进程B. 比如, 进程A的ContentProvider组件正在服务于进程B的某个组件, 或者进程A的service组件和进程B的某个组件绑定等, 这些情况下, 进程A的优先级都不会低于进程B(如果按照优先级规则, 进程A的优先级确实低于进程B, 则系统会选择提高进程A的优先级到和进程B相同).

3. 由于服务进程的优先级高于后台进程, 因此如果activity需要执行耗时操作, 最好还是启动一个service来完成. 当然, 在activity中启动子线程完成耗时操作也可以, 但是这样做的缺点在于, 一旦activity不再可见, activity所在的进程成为后台进程, 而内存不足时后台进程随时都有可能被系统杀死(但是启动service完成耗时操作会带来数据交互的问题, 比如耗时操作需要实时更新UI控件的状态的话, service就不是一个好的选择). 基于同样的考虑, 在BroadcastReceiver中也不应该执行耗时操作, 而应该启动service来完成(当然, BroadcastReceiver的生命周期过于短暂, 也决定了不能在其中执行耗时操作).

相关文章

  • Kotlin Dispatchers协程调度器源码深入分析

    Kotlin Dispatchers协程调度器源码深入分析

    Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中。所以从本质上讲,Kotlin和Java是类似的,都是可以编译产生class的语言,但最终还是会受到虚拟机的限制,它们的代码最终会在虚拟机上的某个线程上被执行
    2022-11-11
  • React-Native之Android(6.0及以上)权限申请详解

    React-Native之Android(6.0及以上)权限申请详解

    这篇文章主要介绍了React-Native之Android(6.0及以上)权限申请详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Android自定义控件ListView下拉刷新的代码

    Android自定义控件ListView下拉刷新的代码

    今天小编就为大家分享一篇关于Android自定义控件ListView下拉刷新的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 融会贯通Android Jetpack Compose中的Snackbar

    融会贯通Android Jetpack Compose中的Snackbar

    这篇文章主要为大家介绍了融会贯通Android Jetpack Compose中的Snackbar方法及使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android 图片网格布局控件示例代码

    Android 图片网格布局控件示例代码

    本篇文章主要介绍了Android 图片网格布局控件示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • BroadcastReceiver动态注册案例详解

    BroadcastReceiver动态注册案例详解

    这篇文章主要为大家详细介绍了BroadcastReceiver动态注册案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Android 图文详解Binder进程通信底层原理

    Android 图文详解Binder进程通信底层原理

    Android系统中,多进程间的通信都是依赖于底层Binder IPC机制,Binder机制是一种RPC方案。例如:当进程A中的Activity与进程B中的Service通信时,就使用了binder机制
    2021-10-10
  • 浅谈Android RecyclerView 间距全适配

    浅谈Android RecyclerView 间距全适配

    本篇文章主要介绍了浅谈Android RecyclerView 间距全适配,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Flutter实现单选,复选和开关组件的示例代码

    Flutter实现单选,复选和开关组件的示例代码

    在App开发过程中,选择交互是非常常见的,今天主要介绍下关于选择的三个组件的使用:开关、单选和复选,感兴趣的小伙伴可以了解一下
    2022-04-04
  • Android获取手机配置信息具体实现代码

    Android获取手机配置信息具体实现代码

    下面为大家介绍下使用android获取手机配置信息的具体过程,感兴趣的朋友可以参考下哈,希望对你有所帮助
    2013-06-06

最新评论