进程的生命周期(Processes and lifecycles)
Android系统总是尽最大的努力来维持一个应用的进程,但系统的内存不足时就可能需要关闭一些旧的进程了,但是决定关闭哪个进程呢,android系统把所以的进程放进一个重要性树里,最低重要性的进程将会被停止,系统有5种重要性等级,重要性从高到低如下:
(1)、前台进程。一个前台进程是当前执行用户请求的进程,如果有如下的一种情形的那么他就是前台进程:
a、这个进程里运行着一个正在和用户交互的Activity(这个Activity的onResume()方法被调用)。
b、这个进程里有绑定到当前正在和用户交互的Activity的一个service
c、这个进程里有一个service对象,这个service对象执行了至少一个他生命周期的函数(onCreate(), onStart(), or onDestroy()).
d、这个进程里有一个执行了onReceive()方法的broadcastreceiver对象
只有一定数量的前台进程在任何时间都存在,他们只有在最后的时刻被停止---系统的内存太少了而不能运行这些仅有的前台进程了),一般的,在那个时刻,手机会重新设置内存页的状态,所以停止一些前台的进程是为了保持对用户操作的快速响应。
(2)可见进程。一个可见进程一个没有任何前台显示的组件,但是仍然可以影响到用户当前屏幕所看见的东西,如果有如下的一种情形那么他就是可见进程。
a、 这个进程里一个Activity,但是这个Activity当前不是在前台显示,但是仍然对用户是可见的(这个Activity的onPause()方法 被调用),比如说一个Activity调用一个dialog,那么这个dialog是当前显示的组件,这个Activity不是在前台显示,但是对用户是 可见的。
b、 这个进程里有一个绑定到一个可见Activity(如上所述的Activity)的service
一个可见进程是极端重要的,只有在为了显示所有前台进程时,即显示前台进程都不够时,才会停止可见进程。
(3)、服务进程。一个服务进程是一个通过startService()启动的但是没有在前两个分类中的进程,虽然服务进程不是用户直接能看见的,但是 他也总是做一些用户很关心的事(如在后台播放mp3,从网络上下载东西),所以系统会一直保持服务进程运行,除非内存不足以运行服务进程,前台进程,可见 进程。
(4)后台进程。一个后台进程是运行一个当前对用户是不可见的Activity(这个Activity的onStop()被调用),这 些进程对用户体验没有什么直接的影响,当内存不足以运行前台进程,可见进程,服务进程时,可以随时停止后台进程,通常有很多的后台进程在运行,系统会把这 些后台进程放进一个LRU中(最近使用队列),最近使用的就最后停止。
(5)空进程。一个空进程就是进程里没有任何活动的应用组件,维持这种进程的唯一原因就是作为一种缓存,当一个组件需要启动时加快启动的速度,系统为了平衡进程缓存和核心缓存会停止这些空的进程。
Android系统会取一个进程里的所以组件的最高重要性来安排进程的重要性,比如说,一个进程里有一个service和一个可见的Activity,那么这个进程会被安排成一个可见进程,而不是服务进程。
另外,一个进程的重要性有可能会因为其他进程的依赖而升高,一个进程不能比他所服务的进程的重要性低,比如有进程A里的service绑定到了进程B的组件上,那么进程A的重要性至少和进程B的一样,或者更高。
因为一个服务进程的重要性比运行一个后台Activity的进程高,所以,当一个Activity做一些长时间运行的任务时,最好启动一个 service来做,而不是放到一个线程里去做,特别是这个任务的时间可能比Activity运行的时间还长的时候,比如在后台播放音乐,或者上传一张图 片到网上,使用一个service保证了这个任务至少是服务进程的重要性,broadcast receiver也是一样,长时间运行的任务也最好是放到一个service里,而不是放到一个线程里。