Android SDK 开发之应用程序基础
2010-03-23 04:53:00 来源:WEB开发网一个可见进程为一个没有任何前台component但仍然能影响用户在屏幕上看到的内容的进程。一个进程满足下列任一条件则被认为是可见进程:
它持有一个activity,该activity不在前台,但仍对用户可见(它的onPause()方法被调用)。例如,一个前台activity为一个对话框,覆盖了后面一个activity。
它持有一个绑定到可见activity的service。
一个可见进程被认为非常重要,只有在需要资源来让所有前台进程运行时才会被Kill掉。
一个服务进程是一个运行着使用startService()启动的service但并非前两种类型的进程。虽然服务进程并非直接和用户看见的东西绑定,它们一般来说正在进行用户关心的操作(例如在后台播放音乐或者下载网络数据),因此系统一般会让它们保持运行状态。
一个后台进程是一个持有一个对用户不可见的activity的进程(Activity的onStop()方法被调用)。这些进程对用户体验没有直接影响,并且可以在任意时间被Kill以保证内存的需要。一般来说有很多后台进程在运行,因此它们被保存在一个LRU列表中来保证最近使用的拥有该activity的进程是最后 kill的进程。如果一个activity正确的实现了它的生命周期方法,并保存了它的当前状态,kill该process将不会对用户体验造成不好的影响。
一个空进程未包含任何活动component的进程。保存这样一个进程的唯一原因就是用来提高下一次运行的速度。为了平衡系统资源,系统常常会清理掉这些进程。
Android将一个进程排在尽可能高的级别,基于其component的重要程度。例如,如果一个进程持有一个service和一个可见的activity,该process将被作为一个可见进程来排序,而不是一个服务进程。
另外,一个进程的排序可能因为其它进程对它的依赖性而上升。一个进程的优先级永远不低于它服务于的进程。例如,如果进程A中的一个content provider服务于进程B中的一个客户,或者如果进程A中的一个service绑定到进程B中的一个component,则A至少和B一样重要。
由于正在运行一个服务的进程比拥有后台activity的进程排序低,因此一个启动一个长期运行的操作的activity可能会启动一个service来做这项工作,而不是启动一个线程——特别是如果该操作会比activity持续的更久的时候。例如播放背景音乐,上传照片等等。使用一个service保证了改操作将至少拥有服务进程的优先级,无论该activity发生了什么。就像前面所说的broadcast receiver生命周期一样,这也是broadcast receiver应该使用service而不是线程来进行耗时操作的原因。
更多精彩
赞助商链接