Android 进程和线程详解

发表于:2013-03-27来源:Csdn作者:引路蜂点击数: 标签:线程
Android 进程和线程详解.当启动一个应用程序组件时,如果该应用没有正在运行的其它程序组件,那么Android系统将为这个应用创建一个新进程(包含一个线程)用于运行应用。

  当启动一个应用程序组件时,如果该应用没有正在运行的其它程序组件,那么Android系统将为这个应用创建一个新进程(包含一个线程)用于运行应用。缺省情况下,一个应用的所有组件(Activity,Service等)运行在同一个进程和线程中(称为“主”线程)。如果在启动一个应用程序组件时,这个应用已经有进程在运行(因为有应用的其它组件存在),那么这个应用程序组件将使用同一进程和线程运行。当然你可以使用不同进程来运行不同的组件,或者在进程中创建新的线程。

  进程

  缺省情况,应用的所有组件都运行在同一个进程,而且应用不应该改变这个传统。然而,如果你发现你需要控制某个组件运行在那个进程中,你可以通过应用程序清单来配置。

  在应用程序清单文件中,每个类型的应用程序组件-,,和都支持 android:process 属性,这个属性用来指明该程序组件运行的进程。你可以为应用程序组件设置这个属性以使每个组件运行在不同的进程中或者某几个组件使用同一进程。你也可以通过设置android:process 使得不同应用中的组件运行在同一个进程中-前提是这些应用使用同一个Linux用户名并且使用同一个证书签名。

  元素也支持 android: process 属性,用来为应用程序的所有组件设置缺省的进程。

  Android系统中系统资源过低而且有需要为用户立即提供服务的进程需要启动时可能会终止某些进程的运行。运行在这些被终止的进程中的程序组件将逐个被销毁。此后如果还有工作需要这些应用程序组件时将启动新的进程。

  系统中决定哪些进程可以杀死时,系统将权衡这些进程对用户的重要性。比如,对于那些运行不可见的Activity的进程比运行屏幕上可见的Activity的进程更容易被杀死。

  进程生命周期

  Android系统会尽可能长的保持应用程序进程的运行,但总会有需要清除旧的进程来释放资源以满足新或是重要的进程的运行。为了决定哪些进程可以杀死,哪些进程需要保留,系统根据运行在其中的应用程序组件和这些组件的状态,将这些进程分配到“重要性层次表”中。具有最低重要性的进程首先被杀死,次重要性的进程为其次等等直到系统恢复所需的资源。

  “重要性层次表”可以分为五个层次,下面列表给出了不同类型的进程的重要性等级(最重要的排在前面):

  1.前台进程

  这种进程是当前用户所需要的。一个进程被认为是前台进程需满足下面条件之一:

  · 本进程中有Activity是当前和用户有交互的Activity(该Activity的onResume()已调用)。

  · 本进程中有Service和当前用户有交互Activity的绑定。

  · 本进程中有在前台运行的Service—该Service调用过startForeground()。

  · 本进程中有Service正在执行某个生命周期回调函数(onCreate(),onStart()或onDestroy())。

  · 本进程中的某个BroadcastReceiver正在执行onReceive()方法。

  2.可见进程

  这种进程虽然不含有任何在前台运行的组件,但会影响当前显示给用户屏幕上的内容,一个进程中满足下面两个条件之一时被认为是个可见进程:

  · 本进程含有一个虽然不在前台但却部分可见的Activity(该Activity的onPause()被调用)。可能发生的情形是前台Activity显示一对话框,此时之前的Activity变为部分可见。

  · 本进程含有绑定到可见Activity的Service。

  3. 服务进程

  该进程运行了某个使用startService()启动的Service,但不属于以上两种情况。尽管此服务进程不直接和用户可以看到的任何部分有关联,但它会运行一些用户关心的事情(比如在后台播放音乐或者通过网络下载文件)。因此Android系统会尽量让它们运行直到系统资源低到无法满足前台和可见进程的运行。

  4.后台进程

  该进程运行一些目前用户不可见的Activity(该Activity的onStop()已被调用),该进程对用户体验无直接的影响,系统中资源低时为保证前台,可见或服务进程运行时可以随时杀死该进程。通常系统中有很多进程在后台运行,这些进程保存在LRU(最近使用过)列表中以保证用户最后看到的进程最后被杀死。如果一个Activity正确实现了它的生命周期函数,并保存了它的状态。杀死运行该Activity的进程对用户来说在视觉上不会有什么影响,这是因为之后用户回到该Activity时,该Activity能够正确恢复之前屏幕上的状态。

  5.空进程

  该进程不运行任何活动的应用程序组件。保持这种进程运行的唯一原因是由于缓存,以缩短下次运行某个程序组件时的启动时间。系统会为了进程缓存和内核缓存之间的平衡经常会清除空进程。

  Android系统会根据进程中当前活动的程序组件的重要性,近可能高的给该进程评级。比如,如果一个进程中同时有一个Service和一个可见的Activity在运行,该进程将被定级为可见进程而不是服务进程(可见进程的优先级高于服务进程)。

  此外,一个进程的级别可能有对其有依赖的其它进程提升—一个给其它进程提供服务的进程的级别不会低于它所服务的进程的级别。比如,进程A中的Content Provider 给进程B中某客户端提供数据服务或者进程A中某个服务被进程B某组件所绑定。那么进程A重要性程度不会低于进程B。

  由于运行Service的进程的级别高于运行后台Activity的进程的级别,一个需要较长时间运行操作的Activity 启动能够完成该操作的Service可能也能很好的完成任务而无需简单创建一个新工作线程—尤其是该操作运行时间比该Activity还要长。比如,如果一个Activity需要完成向服务器上传图片任务时应该使用一个服务来完成上载任务,这些即使用户离开该Activity,Service依然可以在后台完成上载任务。使用Service可以保证某个操作至少具有“服务进程”的优先级而无需关心该Activity发生了什么变化。这也是一个Broadcast Receiver应该使用一个Service而非一线程来完成某个耗时的任务。

  线程

  Android系统启动某个应用后,将会创建一个线程来运行该应用,这个线程成为“主”线程。主线程非常重要,这是因为它要负责消息的分发,给界面上相应的UI组件分发事件,包括绘图事件。这也是应用可以和UI组件(为android.widget和android.view中定义的组件)发生直接交互的线程。因此主线程也通常称为用户界面线程(UI线程)。

原文转自:http://blog.csdn.net/mapdigit/article/details/8711799