Processes

前提:

①组件(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:

一个进程没有持有任何活跃的组件。保留该进程的目的只有一种可能,就是作为缓存,以便下次启动时更快。系统通常会杀掉这类进程。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值