前言
Android在内存紧张的时候会对进程采取一定的策略来终止进程,而这些策略是往往是根据进程的优先级来出处理的
优先级的五个分类
优先级由高到低排列
- 前台进程
- 可见进程
- 服务进程
- 后台进程
- 空进程
前台进程
指正在与用户进行交互的应用进程,该进程数量较少,是最高优先级进程,系统一般不会终止该进程,而判断为前台进程的因素有以下这些
进程中包含处于前台的正与用户交互的activity;
进程中包含与前台activity绑定的service;
进程中包含调用了startForeground()方法的service;
进程中包含正在执行onCreate(), onStart(), 或onDestroy()方法的service;
进程中包含正在执行onReceive()方法的BroadcastReceiver.
可视进程
能被用户看到,但不能根据根据用户的动作做出相应的反馈,
因素
进程中包含可见但不处于前台进程的activity(如:弹出对话窗时activity处于可见状态,但并不处于前台进程中)
该进程有一个与可见/前台的activity绑定数据的service
服务进程
没有可见界面仍在不断的执行任务的进程,除非在可视进程和前台进程紧缺资源(如:内存资源)才会被终止
因素
- 包含除前台进程和可视进程的service外的service的进程
后台进程
通常系统中有大量的后台进程,终止后台进程不会影响用户体验,随时为优先级更高的进程腾出资源而被终止,优先回收长时间没用使用过的进程。
因素
- 包含不在前台或可视进程的activity的进程,也就是已经调用onStop()方法后的activity
空进程
为提高整体系统性能,系统会保存已经完成生命周期的应用程序 ,存在与内存当中,也就是缓存,为下次的启动更加迅速而设计。通常会被定期地终止
进程间的优先级关系
由于组件之间的依赖性, 进程的优先级有可能被提高
当进程A服务于进程B时,进程A的优先级不能低于进程B,但按照优先级的规则来算,进程A的优先级会低于进程B
如:进程A中的content provider为进程B提供服务,或者进程A中有一个Service与进程B中的组件进程绑定
执行耗时操作的进程选择
当执行耗时操作时(如:获取网络数据),我们需要一个新的进程来执行该操作。我们需要考虑是选择通过子线程还是service来执行。如果使用子线程的话,如果当前的activity变成不可见的话,进程便会成为后台进程。但如果选择使用service时,则成为服务进程。而后台进程会随时被终止。所以需要考虑业务的需求来采取不同的策略。
参考资料
Android系统中的进程管理:进程的优先级
Android进程的优先级
https://blog.youkuaiyun.com/fhy_2008/article/details/7328967