进程和应用生命周期

来源:互联网 发布:石家庄网络兼职 编辑:程序博客网 时间:2024/06/16 01:15

大多数情况下,每一个应用都运行在自己的Linux进程之中,当应用不再需要运行,而且系统需要为其他应用获取空间时,进程才会停止运行。

不过Android一个不同寻常的基本特点就是应用的进程生命周期并不是由应用本身控制的,而是由系统综合考虑决定的,因素包括系统所知的该应用运行中的组件、对于用户的重要程度,以及系统所有的可用内存大小。

所以如果不正确地使用应用的组件,就可能导致组件在进行重要的工作时被系统终止掉了。一个例子就是在BroadcastReceiver.onReceive()方法中启动一个新线程,启动后该方法马上返回了,系统认为已经执行完毕了,如果没有其他组件运行的话,系统就可能在需要内存的时候终止掉这个进程,因此也终止掉了其中的子线程。一种解决方案就是在BroadcastReceiver中设置JobService,系统就知道有任务在运行当中了。

为了决定低内存情况下终止进程的顺序,Android根据运行在进程中的组件及其状态来决定进程的优先级。可分为以下几种:
1. 前台进程。即用户正在交互的进程。多种应用组件都可以使所在进程变成前台进程,包括以下几种情况。
- 包含用户正在交互的activity(回调了onResume())
- 包含了正在运行BroadcastReceiver(onReceive()方法正在执行)
- 包含一个Service正在执行回调(Service.onCreate(),Service.onStart(),Service.onDestroy())
前台进程在系统内只有少数几个,内存低的情况下是最后才会被终止掉的。
2. 可见进程。即正在执行用户意识到的任务的进程,所以终止这个进程会导致明显的负面体验。以下几种情况会视为可见进程。
- 正在运行一个可见不可操作的activity(回调了onPause()),比如对话框风格的activity。
- 有个正在运行的前台服务,通过Service.startForeground()方法设为前台服务,表示这个服务用户是意识到的或可见的。
- 有个系统使用的服务,比如动态壁纸、输入法服务等。
3. 服务进程。含有一个调用了Service.startService()方法启动的服务。尽管这种进程通常对于用户不可见,但是可能运行一些用户需要的工作。长期运行的服务(比如30分钟以上)会被降级到缓存进程的级别。可以避免一些内存泄露或者其他问题的长期运行服务消耗系统资源。
4. 缓存进程。是当前不需要的,系统可以随时终止的进程。在一个良好的系统里,总是有多个可用的缓存进程以便切换,只在需要时终止最久的进程。只有在非常严峻的情况下,所有的缓存进程都被终止了,必须开始终止服务进程了。
缓存进程通常包含一个或多个不可见的activity实例(回调了onStop()方法并返回),假设这些activity的生命周期都正确实现了,则系统终止这些进程并不会影响用户体验,可以在新的进程里重新创建activity,恢复原有的状态。
对进程进行分类时,是基于进程内所有正在运行的组件的最高优先级来决定。一个进程的优先级也可能基于其他依赖的进程优先级而提升。