本片文章出自http://blog.csdn.net/andywuchuanlong,转载请说明出处,谢谢!
我答同行问序列目录http://blog.csdn.net/andywuchuanlong/article/details/44194043
1、四大组件全部结束销毁,为什么应用依然在后台运行?为什么不能真正的退出应用?
2、Android中的service是在后台运行的服务,貌似线程也是在后台异步执行,为什么service不能被线程替代?
想要回答第一个问题就需要扯到Android内存管理机制。Android内存的管理有自己的一套机制,它有运行时和自己的虚拟机来管理自己的进程。java应用程序,程序代码运行结束,这个进程就会跟着销毁,而Android程序,就算所有的程序代码运行完毕,所在的进程也不见得会被销毁终止,也就是说Android有它自己管理进程生命周期的一套方式。换句话说Android系统可以自己控制进程的生命周期。当系统在遭遇内存瓶颈的时候,会通过杀死或者停止一些优先级比较低的进程,从而释放内存保证其他进程的运行,但是当系统内存足够的情况下,就算是一个空进程,系统也有可能不会对这个空进程下毒手,因为Android为了优化应用下一次的启动速度,这些比前台进程优先级低的会被缓存在内存中。
上面提到了前台进程和空进程的概念,在Android中有五种进程的概念,优先级依次降低
1、前台进程:一个用户当前工作所需要的,例如:
当有一个Activity正与用户交互,onResume方法被调用,广播在执行onReceive方法,service在执行onCreate等方法,这个应用所在进程就可以视为前台进程,也称为活动进程。
2、可视进程
没有任何前台组件的进程,但是却是用户可以看到的,比如说Activity的onPause方法被调用,此时界面上呈现的是一个对话框
3、服务进程
用startService()启动的服务,但是不满足前面两类
4、后台进程
一个保存着当前用户不可视的进程,Activity的onStop被调用
5、空进程
是一个没有保持活跃的应用程序组件的进程。保持这个进
程可用的唯一原因是作为一个
cache
以提高下次启动组件的速度
是一个没有保持活跃的应用程序组件的进程。保持这个进
程可用的唯一原因是作为一个
cache
以提高下次启动组件的速度
是一个没有保持活跃的应用程序组件的进程。保持这个进
程可用的唯一原因是作为一个
cache
以提高下次启动组件的速度
不符合以上的条件的进程,通常来说空进程的存在是为了缓存在内存中以保证下一次的启动速度。
第二个问题涉及到的就是上面所述的进程问题
应用中的线程是由应用进程派生出来的,当这个进程从可视进程变为后台进程的时候,系统可能由于内存的压力会将其销毁,那么这些线程也会跟着销毁。然后service所在的进程会被作为一个服务进程运行在后台,从优先级可知,服务进程的优先级优先于后台进程,当内存不足时,后台进程会首先被销毁。