与binder server正在交互数据的状态
packageserver 的远程服务packagemanager 加载应用的managerfast XML文件找到应用的主luancher 从而加载应用。
Android的一个核心特性就是:一个应用程序可以利用其它应用程序的元素。例如,如果你的应用程序需要显示图片,而有个人正好写了一个图片浏览程序,你可以直接去调用它。
为达到这个目的,当一个应用程序的任一部分需要启动时,系统都应该能够启动它。因此,Android的应用程序是没有唯一的程序入口的,而是有系统可以运行的基本component。component可以分为4种:
当一个应用程序的第一个component需要运行时,Android为它启动一个包含一个线程的Linux进程。默认情况下,一个应用程序中所有的component都在该进程和线程中运行。
一个component在进程中运行,该进程是被manifest文件所控制的。component元素 — <activity>, <service>, <receiver>, <provider> — 每一个都有一个process属性来指定该component运行的位置。这些属性可以被设置成每个component在各自不同的进程中运行,或者某些component在同一个进程中运行。它们也可以被设置成不同的应用程序的component在同一个进程中运行 — 只要这些应用程序共用同一个Linux user ID。<application>元素也有一个process属性用来设置所有component的默认属性值。
所有的component都在一个进程中的主线程中初始化,对component的系统调用是由该线程调度的。对每一个实例有不同的线程。因此,实例方法 — 例如View.onKeyDown()这样的报告用户动作和生命周期通知的方法 — 永远在主线程中运行。这意味着component不应该做耗时的和阻塞的操作,而是应该创建其它的线程来做。
Android可以决定在资源不足时关闭一个进程。在进程内运行的应用程序的component随之关闭。当有事情要做时,一个进程又会启动。
Android在决定关闭哪个程序时会计算它们对用户的相对重要性。例如,不可见的程序比可见的重要性低。因此是否关闭一个进程的决定取决于component的状态,下一节我们讨论之。
Android系统尝试尽可能长的维护一个应用程序进程,但最后它将在内存不足时把老的程序清除掉。为了决定哪些程序该保留、哪些程序应该kill,Android将每个进程放进一个重要性体系中,基于其中运行的component和它们的状态。重要性最低的进程最先被kill掉,以此类推。该体系中有5个等级:
1.一个前台进程是用户现在做的事情所需要的进程。一个进程满足下列任一条件即被认为是前台进程:
?它正在运行一个正在和用户交互的activity(该Activity对象的onResume()方法被调用)。
?它拥有一个被绑定到用户正在交互的activity上的service。
?它有一个service对象正在运行onCreate(),onStart()或onDestroy()中的一个。
?It has a BroadcastReceiver object that's executing its onReceive() method.
?他有一个BroadcastReceiver对象正在运行onReceive()方法。
在某个时间,只有少数的前台进程会存在。它们只有在极端情况下被Kill——内存严重不足以至于它们不能都同时运行。一般的,在这个时间,设备达到了一个请求分页的状态,因此需要kill一些 前台进程来是用户界面能够响应。
2.一个可见进程为一个没有任何前台component但仍然能影响用户在屏幕上看到的内容的进程。一个进程满足下列任一条件则被认为是可见进程:
?它持有一个activity,该activity不在前台,但仍对用户可见(它的onPause()方法被调用)。例如,一个前台activity为一个对话框,覆盖了后面一个activity。
?它持有一个绑定到可见activity的service。
一个可见进程被认为非常重要,只有在需要资源来让所有前台进程运行时才会被Kill掉。
3.一个服务进程是一个运行着使用startService()启动的service但并非前两种类型的进程。虽然服务进程并非直接和用户看见的东西绑定,它们一般来说正在进行用户关心的操作(例如在后台播放音乐或者下载网络数据),因此系统一般会让它们保持运行状态。
4.一个后台进程是一个持有一个对用户不可见的activity的进程(Activity的onStop()方法被调用)。这些进程对用户体验没有直接影响,并且可以在任意时间被Kill以保证内存的需要。一般来说有很多后台进程在运行,因此它们被保存在一个LRU列表中来保证最近使用的拥有该activity的进程是最后kill的进程。如果一个activity正确的实现了它的生命周期方法,并保存了它的当前状态,kill该process将不会对用户体验造成不好的影响。
5.一个空进程未包含任何活动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而不是线程来进行耗时操作的原因。