Application Fundamentals--Processes and lifecycles(进程生命周期)

Processesandlifecycles---进程生命周期

TheAndroidsystemtriestomaintainanapplicationprocessforaslongaspossible,buteventuallyitwillneedtoremoveoldprocesseswhenmemoryrunslow.Todeterminewhichprocessestokeepandwhichtokill,Androidplaceseachprocessintoan"importancehierarchy"basedonthecomponentsrunninginitandthestateofthosecomponents.Processeswiththelowestimportanceareeliminatedfirst,thenthosewiththenextlowest,andsoon.Therearefivelevelsinthehierarchy.Thefollowinglistpresentstheminorderofimportance:

翻译:Android系统通常总是尽可能延长应用程序所属进程的生命期的,但是,系统最终还是会因为系统资源问题要关闭进程的。关闭进程之前,系统需要判定哪些进程需要继续维持哪些可以被关闭,Android系统是根据每个进程上关联的组件实例以及组件实例的最新状态做为判定每个进程重要程度的依据的,最低重要程度的进程将首先被系统关闭,重要程度共分五个等级(重要程度1-5逐次降低,重要程度在这里也可以理解成系统维护进程等级):

1.Aforegroundprocessisonethatisrequiredforwhattheuseriscurrentlydoing.Aprocessisconsideredtobeintheforegroundifanyofthefollowingconditionshold:---翻译:符合下列四个条件的进程属于前端进程(foregroundprocess):

*Itisrunninganactivitythattheuserisinteractingwith(theActivityobject'sonResume()methodhasbeencalled).--翻译:进程中存在某个activity实例,该实例处于和用户交互状态。(该实例的onResume()方法已经被系统调用)。

*Ithostsaservicethat'sboundtotheactivitythattheuserisinteractingwith.--翻译:进程中某个服务被绑定到某个正在与用户交互的activity实例上。

*IthasaServiceobjectthat'sexecutingoneofitslifecyclecallbacks(onCreate(),onStart(),oronDestroy()).

--翻译:进程中某个Service实例的回调方法:onCreate(),onStart(),或onDestroy()正在被系统执行。

*IthasaBroadcastReceiverobjectthat'sexecutingitsonReceive()method.---翻译:进程中某个BroadcastReceiver实例的onReceive()方法正在执行中(广播消息响应处理中)。

Onlyafewforegroundprocesseswillexistatanygiventime.Theyarekilledonlyasalastresort—ifmemoryissolowthattheycannotallcontinuetorun.Generally,atthatpoint,thedevicehasreachedamemorypagingstate,sokillingsomeforegroundprocessesisrequiredtokeeptheuserinterfaceresponsive.

翻译:由于系统同时只能维护少数几个前端进程,系统关闭前端进程是最不得以的做法,比如内存不足以维持前端进程的运行的时候才会发生。另外,为了保证与用户快速交互,某些前端进程也会被系统关闭的。

2.Avisibleprocessisonethatdoesn'thaveanyforegroundcomponents,butstillcanaffectwhattheuserseesonscreen.Aprocessisconsideredtobevisibleifeitherofthefollowingconditionsholds:

翻译:可视进程中没有任何组件处于前台与用户交互,但是在屏幕上对用户视觉还是影响,符合下面条件的进程属于可视进程:

*Ithostsanactivitythatisnotintheforeground,butisstillvisibletotheuser(itsonPause()methodhasbeencalled).Thismayoccur,forexample,iftheforegroundactivityisadialogthatallowsthepreviousactivitytobeseenbehindit.---翻译:进程中某个activity组件实例已经不在前台,但是对于用户而言依然是可见状态(该实例的onPause()方法已经被系统调用过),例如,当前处于前台与客户交互的是一个对话框,那么前一个activity界面作为背景依然是用户可见状态。

*Ithostsaservicethat'sboundtoavisibleactivity.---翻译:进程中某个服务实例与某个可视状态的activity有着绑定关系。

Avisibleprocessisconsideredextremelyimportantandwillnotbekilledunlessdoingsoisrequiredtokeepallforegroundprocessesrunning.---翻译:可视进程是非常重要的,除非系统需要维护所有的前端进程,否则可视进程是不会被系统关闭的。

3.AserviceprocessisonethatisrunningaservicethathasbeenstartedwiththestartService()methodandthatdoesnotfallintoeitherofthetwohighercategories.Althoughserviceprocessesarenotdirectlytiedtoanythingtheusersees,theyaregenerallydoingthingsthattheusercaresabout(suchasplayinganmp3inthebackgroundordownloadingdataonthenetwork),sothesystemkeepsthemrunningunlessthere'snotenoughmemorytoretainthemalongwithallforegroundandvisibleprocesses.

翻译:服务进程,是正在运行某个由startService()方法启动的服务的进程,尽管说服务进程并没有直接与用户发生交互,但是它所做的事是用户关注的事,比如在后台播放MP3音乐或是在后台通过网络下载数据,所以系统通常总是维持这样的进程的,除非前端进程、可视进程需要更多内存的时候。可以这样理解前端进程、可视进程的重要程度要高于服务进程

4.Abackgroundprocessisoneholdinganactivitythat'snotcurrentlyvisibletotheuser(theActivityobject'sonStop()methodhasbeencalled).Theseprocesseshavenodirectimpactontheuserexperience,andcanbekilledatanytimetoreclaimmemoryforaforeground,visible,orserviceprocess.Usuallytherearemanybackgroundprocessesrunning,sotheyarekeptinanLRU(leastrecentlyused)listtoensurethattheprocesswiththeactivitythatwasmostrecentlyseenbytheuseristhelasttobekilled.Ifanactivityimplementsitslifecyclemethodscorrectly,andcapturesitscurrentstate,killingitsprocesswillnothaveadeleteriouseffectontheuserexperience.

翻译:后台进程是持有某个当前用户不可见的activity实例的进程,(被持有的Activity实例的onStop()方法已经被系统调用过).后台进程就用户体验来说没有什么影响,一旦前端进程可视进程服务进程需要更多内存资源,系统将会随时杀死后台进程。通常有很多后台进程会处于系统维护中状态,系统把所有这些后台进程放在一个LRU(leastrecentlyused)list中,这样做的目的是保证最后被用户看到的activity所属的进程总是最后一个被系统杀死。只要一个activity的回调方法被开发者正确实现、并能够及时俘捉到自身最新状态信息,那么,该实例所属的进程即使被系统关闭也不会影响到客户体验的。

5.Anemptyprocessisonethatdoesn'tholdanyactiveapplicationcomponents.Theonlyreasontokeepsuchaprocessaroundisasacachetoimprovestartuptimethenexttimeacomponentneedstoruninit.Thesystemoftenkillstheseprocessesinordertobalanceoverallsystemresourcesbetweenprocesscachesandtheunderlyingkernelcaches.

翻译:空进程是不持有应用的任何组件实例的进程。系统维护这样的进程的目的是处于缓存的考虑,可以提高组件实例的启动效率。系统也常常杀死这样的进程以换取系统资源、进程缓存、底层核心缓存之间的平衡。

Androidranksaprocessatthehighestlevelitcan,basedupontheimportanceofthecomponentscurrentlyactiveintheprocess.Forexample,ifaprocesshostsaserviceandavisibleactivity,theprocesswillberankedasavisibleprocess,notaserviceprocess.

翻译:Android系统尽可能授予进程更高的维护级别,具体说是根据当前进程中关联的activity实例的状态来给定当前进程维护级别,例如一个进程中关联到一个服务和一个可视的activity实例,该进程将被给定为可视级别。

Inaddition,aprocess'srankingmaybeincreasedbecauseotherprocessesaredependentonit.Aprocessthatisservinganotherprocesscanneverberankedlowerthantheprocessitisserving.Forexample,ifacontentproviderinprocessAisservingaclientinprocessB,orifaserviceinprocessAisboundtoacomponentinprocessB,processAwillalwaysbeconsideredatleastasimportantasprocessB.

翻译:另外,一个进程的系统维护级别可能会由于被其他进程依赖而提高,被依赖的进程的级别总是高于依赖进程。例如:进程A中的内容提供组件是为进程B的一个组件服务的,或是如果进程A中的一个服务实例被绑定到进程B的某个组件实例,那么进程A至少具有和进程D同样的系统维护级别。

Becauseaprocessrunningaserviceisrankedhigherthanonewithbackgroundactivities,anactivitythatinitiatesalong-runningoperationmightdowelltostartaserviceforthatoperation,ratherthansimplyspawnathread—particularlyiftheoperationwilllikelyoutlasttheactivity.Examplesofthisareplayingmusicinthebackgroundanduploadingapicturetakenbythecameratoawebsite.Usingaserviceguaranteesthattheoperationwillhaveatleast"serviceprocess"priority,regardlessofwhathappenstotheactivity.AsnotedintheBroadcastreceiverlifecyclesectionearlier,thisisthesamereasonthatbroadcastreceiversshouldemployservicesratherthansimplyputtime-consumingoperationsinathread.

翻译:由于服务进程(执行某个服务的进程)的系统维护级别总是高于某个关联了一个activity实例的后台进程的系统维护级别,这就意味这服务进程要比这个关联了一个activity实例的后台进程活的更长。所以,使用服务执行长时间操作要比使用一个activity实例来执行同样的耗时操作要更为合适。例如:后台音乐播放和把用照相功能俘获的图像信息上次到某个网站这样的耗时操作,如果使用的是服务组件,那么当前进程就是服务进程维护级别。在Broadcastreceiverlifecycle章节中,也说到过类似的问题,都是出于同样的考虑,广播接收组件实例的onReceive()方法中不应该用独立线程的方式执行耗时操作,而是应该使用服务组件执行这样的操作。

相关推荐