前提:
①组件(Components):Activities、Services、Content Providers、Broadcast Receivers.
②进程(Processes)、线程(Threads)
当一个应用程序组件启动,且没有其他组件正在运行时,安卓系统会为这个应用启动一个新的进程和一个干活的单线程。默认情况下,同一应用程序的所有组件运行在同一进程和线程(即,主线程)。
如果一个应用程序组件启动,且该应用程序已有一个进程(由于该应用程序的另外一个组件已存在),那么这个组件将在已有进程中启动,并使用同一线程。
当然,我们也可以安排应用程序内的不同组件在不同的进程里运行,另外也可以为任一进程再创建额外的线程。
Processes
默认情况下,同一应用的所有组件都运行在同一进程中,并且大多数应用程序就应该这个样子。
如果你觉得需要控制某一特定组件归属于某个进程,那么可以在manifest文件中指定。
manifest的各类组件元素(<activity>、<service>、<receiver>、<provider>)项,都支持android:process属性,可以为组件指定一个进程。我们可以设置这个属性,以便每个组件运行在自己的进程里,或者一些组件共享一个进程而其他组件运行在别的进程里。我们也可以设置这个属性,以便不同应用的组件运行在同一进程里--前提是这些应用共享同一Linux用户ID且用同一证书签名。
另外,<application>元素也支持android:process属性,用于设置一个应用于所有组件的默认进程。
Android可能会在某一时刻关闭一个进程,比如说,内存吃紧且其他优先级跟高的进程有需要的时候。应用程序运行所在的进程被杀掉导致组件被销毁,当然组件有需要的话进程会再次启动。
当决定哪些进程要被杀掉时,android系统会权衡进程与用户的关联度。
Process lifecycle
Android系统会尽可能长得保留一个应用的进程,但最终还是需要移除旧的进程来回收内存,分配给新的进程或更重要的进程。
重要性分级分五级:
Foreground process:
一个用户正在操作所需的进程。一般满足一下几个条件之一的就认为是foreground:
①持有一个用户正在交互的Activity.
②持有一个Service,且与一个用户正在交互的Activity绑定。
③持有一个Service,且调用了它的startForeground()方法。
④持有BroadcastReceiver,且正在调用它的onReceive()方法。
Visible process:
一个进程没有前台展示的组件,但仍能响应用户可见界面内容。满足一下几条中的一条即被认为是visible:
①持有一个非最前端的Activity,但仍然对用户可见,比如一个Activity上弹出一个对话框。
②持有一个Service,且绑定一个visible的Activity或foreground的Activity。
Service process:
一个进程调用了startService方法运行了一个Service,但没在前面提到的两种高优先级的范畴内。、
虽然service processes没有跟用户可见行为扯上关系,但通常会正在做一些用户在乎的事,比如后台播放音乐,后台网络下载,所以系统会保留他们,除非没有足够内存与前面两种高优先级的进程共存,才会杀掉该进程。
Background process:
通常有很多background processes在运行,所以它们都被保存在LRU(least recently used:最近最少使用)列表中,从而确保最近被用户查看过的Activity所在的进程最后才杀掉。
Empty process:
一个进程没有持有任何活跃的组件。保留该进程的目的只有一种可能,就是作为缓存,以便下次启动时更快。系统通常会杀掉这类进程。