引言
大部分时候,每个安卓应用都是运行在他们自己的linux进程中。当一个App的代码需要执行的时候就会创建一个进程,这个进程会一直运行除非当它不再被需要或者系统为了给其他应用腾出空间。
Android 系统一个不同寻常但却是基本的特性是应用进程的寿命并不是由应用程序本身直接控制的,而是由系统通过系统知道正在运行的部分应用程序的组合,应用程序对用户的重要性以及系统中可用的整体内存来确定。
一个进程生命周期的BUG是当一个BroadcastReceiver当在onReceive方法中接收到一个意图后开启了一个线程,之后在onReceive方法中return了。一旦这个方法return了,系统认为这个广播接收者就不再是活跃的,因此,其托管的进程就不再被需要了(除非其他应用程序还在使用它)。所以系统为了回收内存在未来某个时间会杀死这个进程,同时也会杀死进程中所有线程。解决方案是在BroadcastReceiver中使用JobService。
进程类型
为了搞清楚那些进程在系统内存不足时需要被杀死,Android会为每个进程分配一个“重要性等级”,下面是几个类型(重要性从高到低):
- ****前台进程****
前台进程是用户当前正在执行的进程,当出现以下情况可以表明这个进程是前台进程:
- 当一个Activity运行在屏幕上并且用户可以和它交互(onResume方法被调用)
- 当一个BroadcastReceiver正在运行(onReceive方法正在执行)。
- 一个Service正在执行后面方法中的一个的时候(onCreate,onStart,onDestroy)。
在系统中只有少数的这种进程,并且不到万不得已的时候系统不会杀死这些进程。
- ****可见进程****
可见进程是正在做用户可意识到的工作的进程,所以杀死它会对用户体验有影响,以下情况表明一个进程是可见进程:
- 当一个Activity对于用户来说可见但不是在前台的时候(onPause被调用),譬如说,打开一个Dialog样式的Activity时。
- 当一个Service通过startForeground方法作为前台服务运行时。
- 当一个进程包含了一个用户可以感知到的用于特殊功能的Service,譬如说动态壁纸和输入服务等。
可见进程只有在要保证所有前台进程的运行的时候才会被杀死。
- ****服务进程****
服务进程包含一个已经通过startService方法启动的Service。虽然这些进程对用户并不是直接可见,但它们做的事情通常都是用户关心的,所以只有在前台进程和可见进程没有足够内存时才会杀死它。
Service在运行了长时间(30分钟或以上)后它的重要性会被降级为缓存进程。 - ****缓存进程****
缓存进程是一个当前不再被需要的进程,所以系统在内存不足的时候可以自由决定是否杀死它。
缓存进程通常包含着一个或多个Activity的实例并且这些Activity对于用户来说已经不可见了(onStop方法被调用并且返回了)
缓存进程都存储在一个LRU缓存列表中,为了回收内存最后一个进程会第一个被杀死
网友评论