应用进程托管
在Android中,应用进程的构造与销毁由系统掌控,称之为应用进程托管。
Android通过进程托管,在没有虚拟内存机制下,实现多进程多任务的并发处理。托管策略优劣决定了系统运行效率。
托管的引入是为了简化编程模型,为了全局调度和优化进程对系统资源的使用。
进程优先级
进程优先级是进程托管的基础。Android通过每个应用进程中组件类型和运行特征,将进程划分为不同的优先级。优先级越高,该进程组件对用户当前的状态越重要。对应的,系统应分配的资源就越多,进程运行的时间也越长。
应用进程按优先级分为:前台进程、可视进程、服务进程、后台进程、空进程。优先级的评定依据:进程中的界面组件、服务组件和触发器组件的运行情况。
数据源组件不会作为优先级评定条件,因为数据源是持久的。
优先级的高低由应用进程中组件与用户的交互状态来确定。进程中包含的组件与用户的交互越密切,优先级越高。
前台进程优先级最高,可占据资源最多。
前台进程、可视进程、服务进程统称为体验性进程,子要资源运行就不回收这些进程。后台进程、空进程称为性能型进程。
进程回收算法
在Android中,每个应用进程的生命周期由系统控制,系统会根据进
程优先级、资源状况等因素,决定何时回收。
回收进程的原则:
尽量延长进程的生命周期,在资源运行的范围内,尽量不回收已创建的应用进程;
组件进程按优先级由低到高回收;
同等优先级进程,越近被使用过的越晚回收。
对体验型进程和性能型进程回收策略不同。
性能型进程回收,发生在组件状态特定改变时,这些状态有:
界面组件被销毁,Activity.onDestory()被调用;
触发器组件完成执行,BroadcastReceiver.onReceive()执行完毕;
触发器组件停止监听广播事件,即Context.registerReceiver()函数注销了对应的触发器组件;
系统进入待机状态。
性能型进程回收流程:
首先Android会计算系统可接受的“性能型”进程的最大数量A(默认为2),如果现有“性能型”进程的数量低于A,则无需回收;
如果现有“性能型”进程的数量高于A,先行回收空进程。所有空进程按最近访问时间由晚到早依次回收。一旦如果现有“性能型”进程的数量低于A,则停止回收。
若所有空进程回收完毕,如果现有“性能型”进程的数量高于A,系统开始回收后台进程,直至进程的数量低于A。
“性能型”进程回收按数量控制——粗粒度,不精确。
当系统完成“性能型”进程回收后,还进行后台界面组件回收过程。后台界面组件进程的默认值是2,超过2则开始回收。
组件被回收前,Android先调用Activity.onSaveInstanceState函数,将界面组件数据写道磁盘暂存。如果需要再次构造该组件,则会调用
Activity.onResourceInstanceState函数恢复到回收前的状态。
进程的强行终止
若进程组件触发了未捕获的异常或运行错误,会导致应用进程变成异常进程,无法继续执行。此时,android会强制终止组件的运行。
组件管理服务在终止进程前,会保存异常发生时进程各个任务中界面组件栈的内容,终止进程后,会重新构造新的应用进程,并将各个任务的组件栈恢复至异常发生前的状况。
若组件执行同步操作时间过长,或进程对用户的操作无法及时响应,会被视为无响应进程。常见状况有:
对用户操作5秒还没有响应;触发器组件执行BroadcastReceiver.onReceive()的时间超过10秒。
掌控进程的优先级
掌控进程优先级最重要的是把握各个组件的优先级,在不同的生命周期内,做合适的事情。
Android2.0开始支持前台服务组件,大多数情况下,服务组件在后台提供服务,但如在放音乐时,开发者期望提示服务组件的优先级,更稳定的提供服务,开发者可以通过Service.startForeground方法,将服务组件与Android的通知栏绑定,为后台服务打开一扇与用户交互的窗口,将所在进程提升为前台进程,避免被系统回收。stopForeground(true)停止前台状态。
相关推荐
这个PPT讲Android应用程序进程的启动和回收,主要涉及到Zygote进程、System Server进程,以及组件管理服务ActivityManagerService、窗口服务WindowManagerService,还有专用驱动Low Memory Killer。通过了解Android...
2.5 剖析Android应用程序的结构 2.6 分析Notepad应用程序 2.6.1 加载和运行Notepad应用程序 2.6.2 分解应用程序 2.7 了解应用程序生命周期 2.8 调试应用程序 2.8.1 启动模拟器 2.8.2 ...
2.5 剖析Android应用程序的结构 2.6 分析Notepad应用程序 2.6.1 加载和运行Notepad应用程序 2.6.2 分解应用程序 2.7 了解应用程序生命周期 2.8 调试应用程序 2.8.1 启动模拟器 2.8.2 ...
Android应用程序将生成供Nodejs使用的自签名HTTPS证书。 Nodejs将公开一个供应用程序侦听的端口,并由这些HTTPS证书进行安全保护以进行加密以及双向身份验证。 flowcrypt-ios-prod.js :适用于iO
===============================================... android-app / Android应用程序,用于通过HTTP控制放大器android-widget /主屏幕小部件,用于通过HTTP控制放大器节点/节点文本处理器,用于通过HTTP控制放大器====
官方应用程序也可以在和贡献添加了最佳分数存储添加了用于在移动设备上进行滑动处理的自定义代码使滑动在 Windows Phone 上工作添加了对 Android 2.3 的支持非常感谢 、 、 、 和的许多其他良好贡献。 截屏 顺便说...
2048 的小克隆,基于 (也是一个克隆)。 只是为了好玩。...这是我在业余时间制作的,它托管在 GitHub 上(这意味着我没有任何托管费用),但是如果您喜欢游戏并想给我买咖啡,您可以在我的 BTC 地址捐款:
2048 的小克隆,基于 (也是一个克隆)。 只是为了好玩。...这是我在业余时间制作的,它托管在 GitHub 上(这意味着我没有任何托管费用),但是如果您喜欢游戏并想给我买咖啡,您可以在我的 BTC 地址捐款:
您可以在找到相同的信息执照2048已根据获得捐献我是在业余时间制作的,它托管在GitHub上(这意味着我没有任何托管费用),但是如果您喜欢这款游戏,并且想购买我的咖啡,则可以在我的BTC地址捐赠: 1Ec
官方应用程序也可以在和 贡献 和是这个存储库的维护者。 其他著名贡献者: 添加了最佳分数存储 添加了用于在移动设备上进行滑动处理的自定义代码 使滑动在 Windows Phone 上工作 添加了对 Android 2.3 的支持 ...
官方应用程序也可以在和 会费 和是该存储库的维护者。 其他著名的贡献者: 增加了最佳成绩存储 添加了用于在移动设备上进行滑动处理的自定义代码 使滑动可在Windows Phone上使用 添加了对Android 2.3的支持 非常...