Android 进程生命周期 Process Lifecycle
进程的生命周期
Android系统会尽力保持应用的进程,但是有时为了给新的进程和更重要的进程回收一些内存空间,它会移除一些旧的进程。
为了决定哪些进程留下,哪些进程被杀死,系统根据在进程中在运行的组件及组件的状态,为每一个进程分配了一个优先级等级。
优先级最低的进程首先被杀死。
这个进程重要性的层次结构有五个等级,下面就列出这五种进程,按照重要性来排列,最重要的放在最前。
一.前台进程 Foreground process
前台进程是用户当前做的事所必须的进程,如果满足下面各种情况中的一种,一个进程被认为是在前台:
1.进程持有一个正在与用户交互的Activity(Activity正处于onResume()的状态)。
2.进程持有一个Service,这个Service和用户正在交互的Activity绑定。
3.进程持有一个Service,这个Service是在前台运行的,即它调用了 startForeground()
。
4.进程持有一个Service,这个Service正在执行它的生命周期回调函数(onCreate()
, onStart()
, or onDestroy()
)。
5.进程持有一个BroadcastReceiver,这个BroadcastReceiver正在执行它的 onReceive()
方法。
杀死前台进程需要用户交互,因为前台进程的优先级是最高的。
二.可见进程 Visible process
如果一个进程不含有任何前台的组件,但是仍然影响着用户在屏幕上可以看到的内容,就是可见进程。
可见进程满足下列情况之一:
1.进程持有一个Activity,这个Activity不在前台,但是仍然被用户可见(处于onPause()调用后又没有调用onStop()的状态)。
这种情况发生在,比如,前台的activity打开了一个对话框,这样activity就会在其后可见。
2.进程持有一个Service,这个Service和一个可见的(或者前台的)Activity绑定。
可见的进程也被认为是很重要的,一般不会被销毁,除非是为了保证所有前台进程的运行而不得不杀死可见进程的时候。
三.服务进程 Service process
如果一个进程中运行着一个service,这个service是通过 startService()
开启的,并且不属于上面两种较高优先级的情况,这个进程就是一个服务进程。
尽管服务进程没有和用户可以看到的东西绑定,但是它们一般在做的事情是用户关心的,比如后台播放音乐,后台下载数据等。
四.后台进程 Background process
如果进程不属于上面三种情况,但是进程持有一个用户不可见的activity(activity的onStop()被调用,但是onDestroy()没有调用的状态),就认为进程是一个后台进程。
后台进程不直接影响用户体验,系统会为了前台进程、可见进程、服务进程而任意杀死后台进程。
通常会有很多个后台进程存在,它们会被保存在一个LRU (least recently used)列表中,这样就可以确保用户最近使用的activity最后被销毁,即最先销毁时间最远的activity。
五.空进程
如果一个进程不包含任何活跃的应用组件,则认为是空进程。
保存这种进程的唯一理由是为了缓存的需要,为了加快下次要启动这个进程中的组件时的启动时间。
系统为了平衡进程缓存和底层内核缓存的资源,经常会杀死空进程。
相关说明
1.Android会尽可能地把进程放在高的优先级。
比如,一个进程拥有一个可见状态的activity和一个service,这个进程会被认为是可见进程,而不是服务进程。
2.一个进程的等级有可能会因为其他进程的依赖而提高,一个进程服务于另一个进程,则它的优先级不会比它服务的进程优先级低。
比如,A进程中的一个content provider向B进程中的一个客户提供服务,或A进程中的一个service被绑定在B进程中的一个组件上,则A进程的优先级至少和B进程的优先级一样高。
3.因为服务进程的优先级比后台进程的优先级高,所以对于一个需要启动一个长时间操作的activity来说,开启一个service比创建一个工作线程的方法更好,尤其是对于操作将很可能超出activity的持续时间时。
比如要上传一个图片文件,应该开启一个service来进行上传工作,这样在用户离开activity时工作仍在进行。使用service将会保证操作至少有服务进程的优先级。
参考资料
Sandy Zhang Android深入浅出 视频教程——进程生命周期。
API Guides: Processes and Threads
http://developer.android.com/guide/components/processes-and-threads.html
Android 进程生命周期 Process Lifecycle相关推荐
- android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)
在上篇文章: warmcheng:Android生命周期组件 Lifecycle 使用详解zhuanlan.zhihu.com 中,我们讲了 Lifecycle 的简单使用,本篇我们来研究下它的源码 ...
- Android Acitivity 生命周期
Fragment 的生命周期: Android Fragment 生命周期及其API使用(建议使用自定义View替换Fragment) Activity的生命周期: (1)启动Activity:系统会 ...
- android代理生命周期,了解 Activity 生命周期
当用户浏览.退出和返回到您的应用时,您应用中的 在生命周期回调方法中,您可以声明用户离开和再次进入 Activity 时 Activity 的行为方式.例如,如果您正构建流媒体视频播放器,当用户切换至 ...
- Android活动生命周期
一.Android活动 活动是 Android 应用框架中的一个核心组件,它在一个窗口(Window)对象中绘制用户接口并响应用户的交互. Android四大核心组件分别为Activity(活动).S ...
- 【Linux进程、线程、任务调度】一 Linux进程生命周期 僵尸进程的含义 停止状态与作业控制 内存泄漏的真实含义 task_struct以及task_struct之间的关系
学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 文章目录 1 ...
- Android安卓——Android程序生命周期
多处的开发者都给使用者了一个方便,给一些东西设置了一个生命周期的东西.本次学习主要对安卓中程序的生命周期进行讲解. 充分了解安卓生命周期,记住生命周期的优先级,为后续的开发打基础. Android程序 ...
- Android RxJava生命周期管理解决方案整理
一.为什么要做生命周期管理? Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void sub ...
- Android Activity 生命周期详解及监听
前言 系列文章: Android Activity 与View 的互动思考 Android Activity 生命周期详解及监听 Android onSaveInstanceState/onResto ...
- 【Linux 内核】进程管理 ( Linux 中进程的 CPU 资源调度 | 进程生命周期 | 创建状态 | 就绪状态 | 执行状态 | 阻塞状态 | 终止状态 | 进程生命周期之间的转换 )
文章目录 一.Linux 中进程的 CPU 资源调度 二.进程生命周期 三.进程生命周期之间的转换 一.Linux 中进程的 CPU 资源调度 Linux 操作系统 是 多任务系统 , 可以 同时运行 ...
最新文章
- 飞天茅台超卖事故:Redis分布式锁请慎用!
- 一个常用的表单文本框input输入提示
- Linux的文件系统及其硬盘分区挂载原理
- 企业:怎样的渗透测试频率是合适的?
- mdp文件-Chapter4-MD.mdp
- 水木告白工作室:Java从零入门之模仿头条资讯(一)
- 不同技术团队的配合问题及DevOps
- 【文末福利】图论算法:稳定婚姻问题,如何找到最适合自己的另一半
- e分钟带你利用Python制作词云图
- model数据库orm操作
- linux数据软件,Linux数据安全工具:数据镜像软件DRBD的管理与维护
- 百度SDN实践与思考
- 移动应用的黄金四分类
- ResponsibleChain(责任链模式)
- python删除word表格中的某一行_python-docx添加和删除表格行、列
- 数据库实验八 触发器实验
- PDF文件密码怎么解除
- C语言应用(1)——Unix时间戳和北京时间的相互转换
- 精美黑色UI版创客新零售系统源码
- Linux中的lo回环接口详细介绍
热门文章
- linux支持ppp网卡,linux和安卓上(ppp widget)使用3g网卡的方法
- java 属性访问修饰符_Java中的访问修饰符(二十七)
- vue 页面引入多个内部js_.html多页页面引入vue.js怎么开发?
- java生成随机十位数_随机10位字符串生成
- 给你的网页添加随机BGM背景音乐
- try-catch捕获异常信息后Spring事务失效处理方法
- kmp学英语必须设置
- Memcache安装 2
- jQuery:从零开始,DIY一个jQuery(1)
- LeetCode 31. Next Permutation