一、Android进程:
Android系统会尽可能长的延续一个应用程序进程,但在内存过低的时候,仍不可避免需要移除旧的进程。重要性最低的进程首先被消灭,然后是较低的,依此类推。重要性共分五级:
(1)前台进程
是用户操作所必须的,任一时间下,仅有少数进程会处于前台(这样的进程拥有一个在屏幕上显示并和用户交互的 activity 或者它的一个IntentReceiver 正在运行),当内存实在无法维持他们同时运行时才会杀死某个前台进程,以保持其他前台进程正常运行。
(2)可见进程
没有前台组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可见的:
●它包含着一个不在前台,但仍然为用户可见的activity(它的onPause()方法被调用)。
这种情况可能出现在以下情况:前台activity是一个对话框,而之前的Activity位于其下并可以看到。
●它包含了一个绑定至一个可见的activity的服务。
重要性排在可见进程之后。
(3)服务进程
是由startService() 方法启动的服务,它不会变成上述两类。
尽管服务进程不会直接为用户所见,但它们一般都在做着用户所关心的事情(比如在后台播放mp3或者从网上下载东西)。
重要性排在可见进程之后。
(4)后台进程
包含目前不为用户所见的activity(onStop() 方法已被调用)。
后台进程一般存放于一个LRU(最后使用)列表中以确保最后被用户使用的activity最后被杀死。
重要性排在服务进程之后。
(5)空进程
不包含任何活动应用程序组件。这种进程存在的唯一原因是做为缓存以改善组件再次于其中运行时的启动时间。
系统经常会杀死这种进程以保持进程缓存和系统内核缓存之间的平衡。
重要性最低。
1) 依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别。
如果一个进程中同时有一个服务和一个可见的activity,则进程会被判定为可见进程,而不是服务进程。
2) 一个为其它进程提供服务的进程级别永远高于它服务的进程。
如果A进程中的内容提供者为进程B中的客户提供服务,或A中的服务为B中的组件所绑定,则A最低也会被视为与B拥有同样的重要性。
二、在Service中启动子线程和直接启动子线程的区别
(1)若我们直接在Activity中新开一个线程来做耗时操作,当该Activity退出到桌面或其他情况时将成为一个后台进程。
(2)若我们在Service中新启动线程,则此时Android会依据进程中当前活跃组件重要程度,将其判断为服务进程,优先级比(1)高。
三、总结:
因为运行着一个服务的进程重要级别总高于一个后台Activity,所以在Service中启动耗时任务比在Activity中启动要好。
我们以背景音乐播放和上传一个相机拍摄的照片至网站上为例。使用服务至少可以保证操作拥有“服务进程”的权限。
在内存紧缺的情况下,能保证其不那么容易被杀死。这也是广播接收器使用服务,而不是线程来处理耗时任务的原因。
本文介绍了Android中进程的五种类型及其重要性,强调了Service作为服务进程的优先级高于后台Activity。讨论了在Service中启动子线程与直接在Activity中启动子线程的区别,指出Service更适合执行耗时任务,以保证在内存紧张时继续运行。
1368





