快速预览
       1.  默认情况下,每个应用运行在其各自的进程中,应用的组件运行在这个进程中。
       2. 任何速度较慢的或可能阻塞主线程的操作都应该在新的线程中运行,以避免影响用户操作。


       概述

       在应用没有组件运行的情况下,系统会为应用开启一个linux进程并创建一个线程,如果存在该应用的组件在运行,那么该应用启动时会在已经存在的进程上运行。也可以将不同的组件安排到不同的独立进程中运行,而且可以为任何进程创建额外线程。<activity>, <service>, <receiver>, 和<provider>等组件支持通过android:process属性指定运行的进程。可以为每个组件指定独立的一个进程,或安排组件共用进程,也可以为应用的所有组件指定同一个进程(让多个应用公用相同的linux 用户id和共同的签名证书)。


进程的生命周期

根据重要程度将进程分为如下五个等级:


1. 前台进程


用户正在进行操作的进程,当有下列时间发生时,一个进程被人为是前台进程。


*当该进程持有一个用户正在与用户交互操作的activity时(该activity的onResume方法已经被调用)。


*当该进程持有一个service,且该service绑定的activity正在跟用户进行交互。


*当该进程持有一个service,且该service正“在前台运行--该service调用了startForeground()。


*当该进程持有一个service,且该service正在执行生命周期回调函数中的一个时(onCreate(),onStart(),onDestroy())


*当该进程持有一个BroadcastReceiver, 且它正在执行onReceiver()方法。


一般情况下,任何情况下,只有少量的前台进程存在。只有在设备内存消耗完,已经无法继续运行时他们才会被杀死,这种情况下,往往是设备内存消耗达到了一个边界值,需要杀死一些前台进程已响应用户操作。



2. 可见进程


这类进程没有任何前台组件,但是仍然能够影响用户屏幕显示,当一个进程满足下列条件中的一种时,该进程就被称为一个可见进程。


* 该进程持有一个不在前台的activity,但是该activity仍然是可见的(此时他的onPause方法已经被调用),比如,前台activity启动了一个Dialog, 这使得之前的activity在其后面是可见的,或者一个activity启动了另外一个弹出式的activity。


* 该进程持有一个service,且该service与一个可见的(前台的)activity绑定。


可见进程是非常重要的,除非必须杀死可见进程才能保证前台进程正常运行,否则,可见进程一般不会被杀死。



3. 服务进程


当一个进程持有一个正在运行且由startService()启动的service,并且该进程不属于前台进程和可见进程可见进程,这类进程被称为服务进程。尽管服务进程不直接与用户可见的任何东西绑定,但通常情况下,用户会比较关心该进程正在做的事情(如音乐播放和文件下载),这种情况下,系统会保持他们的运行状态,除非,内存不足以让这类进程与前台进程和可见进程共存。



4. 后台进程


当进程持有一个用户不可见的activity(该activity的onStop方法已经被调用),着类进程就被称为后台进程。这些进程不会影响用户的所见,系统可以再任何时候杀死他们以释放内存,提供给前台进程,可见进程或服务进程。通常情况下,系统中会有很多后台进程在运行,他们被保持在一个LRU(least recently used)列表中,以确保最近杀死的进程持有一个


用户最近可见的activity。假如一个activity正确地继承了其生命周期方法,且保存了最近的状态,那么杀死其所在的进程不会对用户体验造成可见的影响,因为当用户回退到该activity时,该activity可以恢复他所有的可见状态,可以查看activities文档寻求更多关于保存和恢复activity的更多信息。



5. 空进程


当一个进程不包含任何的活动应用程序组件时,该进程就被称为空进程。 保持该类进程主要是为了缓存, 以便下次启动该组件的时候提高启动时间 ,系统通常杀死此进程主要是为了综合平衡进程间缓存和底层内核缓存之间的系统资源。



Q:除了以上的优先级外,还有其他因素决定进程的优先级吗? 


A:  进程的优先级取决于所有组件中的优先级最高的部分。 


        进程的优先级会根据与其他进程的依赖关系而变化。