[译文]进程和线程

【译文】进程和线程–进程篇

原文地址:Processes and Threads (请自备梯子,也可以点击这个邀请链接获取梯子:红杏 ,这样双方都可多得十天的免费使用)

进程和线程的使用在android开发中使用频率是很高的,虽然学习android有一段时间了,但是对于android的线程管理以及消息通信机制还是会有些许的生疏,故又翻看了官网的相关介绍,顺便把它翻译过来。

当一个应用程序组件开始启动并且该应用程序还没有任何其他组件正在运行当中的时候,android系统就会为该应用程序新建一个仅有一个执行线程的linux进程. 同一个应用程序中的所有组件默认是运行在同一个进程和线程(即所谓的main线程,译者注:也叫UI线程)中的. 如果一个应用程序组件启动并且该应用程序已经存在与其相对应的进程时(因为该应用程序的其他组件已经存在),那么该组件就会在该进程中使用同一个线程执行(译者注:main线程). 但是,你可以安排不同的组件在应用程序运行在单独的进程,你也可以为任何进程创建额外的线程.

这篇文档讨论了在一个android应用程序中进程和线程是如何工作的.

进程

同一个应用程序中的所有组件默认是运行在同一个进程中的,并且大部分应用程序不应该去改变它. 但是,如果你发现你需要去控制某个组件所属的进程,你可以在manifest文件中声明.

在manifest文件中的<activity>,<service>,<receiver>和<provider>元素支持android:process属性,你可以通过这个属性指定一个个进程来运行某个组件. 你可以设置这个属性,从而使得每个组件可以运行在它自己的进程中或者一些组件共享一个进程,而其他组件则不是. 你也可以设置android:process使得不同应用程序的组件运行在同一个进程中(应用程序共享相同的Linux用户ID和赋予同样的证书).

元素也支持android:process属性,可以在此为所有组件设置一个默认值.

当内存不足并且其他进程更接近于服务用户时,Android系统可能会决定在某个时刻关闭一个进程. 运行在被杀死的进程中的应用程序的组件就会被销毁掉. 当它再次为用户服务的时候,一个进程会重新启动.

当决定哪个进程被杀死时,android系统会权衡它们对用户的重要性. 比如,与某个进程中持有可见的activities相比,android系统会更倾向于关闭一个在屏幕上持有没有可见的activities的进程. 因此,决定是否终止一个进程,取决于进程中组件的运行状态. 终止进程的判定规则将会在下面讨论.

进程生命周期

android系统会尽可能长时间的维持一个应用程序进程,但是最终还是需要为新的或者更重要的进程移除旧的进程来获得内存空间. 系统会将每个进程以“重要等级”(根据组件的运行过程以及这些组件的状态)分开放置. 当需要恢复系统资源时,拥有最低重要性的进程首先被杀死,然后是那些次最低重要性的进程等等.

重要性等级分为五个层次.下面按顺序列举了不同类型的进程(第一个进程是最重要的,也是最晚杀死的):

1.Foreground process(前台进程)

用户正在使用的进程. 如果以下任何情况为true时,一个进程会被认为是Foreground process:

  • 它拥有一个用户正在使用的Activity(Activity的onResume()方法被执行).

  • 它拥有一个绑定在用户正在使用的activity中的Service.

  • 它拥有一个运行在前台(foreground)的Service(Service执行了startForground()).

  • 它拥有一个正在执行它的生命周期中的其中之一的Service(onCreate(),onStart(),或者onDestroy()).

  • 它拥有一个正在执行它的onReceive()方法的BroadcastReceiver.

一般来说,只有少数的前台进程存在在任何给定的时间里. 它们只有当内存十分低并且不能继续运行的时候才会被当做最后的补救措施而被杀死. 在这一点上,通常来说装置已经到达一个内存分页状态,因此杀死一些前台进程来维持用户界面的响应.

2.Visible process(可视进程)

一个没有任何前台组件,但是依然影响着用户看到的屏幕的进程。如果以下两者之一的状态为true时,一个进程会被认为是可视(Visible)的:

  • 它拥有一个不在前台,但是依然对用户可见的Activity(它的onPause()方法被执行). 比如,如果前台的Activity开启了一个Dialog,这种情况可能就会出现.

  • 它拥有一个绑定在一个可视(Visible)或者前台(foreground)的Activity上的Service.

一个可见的进程被认为是非常重要的,并且不会被杀死,除非这样做会要求保持所有前台进程的运行.

3.Service process(服务进程)

一个通过startService()方法启动的Service,并且没有掉进两个更高的类别中的进程. 尽管服务进程不会直接关系到用户所见的,它们通常会做一些用户关心的事情(比如在后台播放音乐,或者从网络上下载数据资源), 因此系统会保持它们的运行状态,除非系统没有足够的内存去和全部前台和可视的进程保持在一起.

4.Background process(后台进程)

一个拥有现在对用户不可见的activity的进程(activity的onStop()方法被执行). 这些进程对用户体验没有直接的影响,系统会为一个前台,可视,或者服务进程获得内存空间而随时杀死它们. 通常会有许多后台进程在运行,因此它们会被保持在一个LRU列表中去保证这个被用户最近看见的activity所在的进程被最后杀死. 如果一个activity正确实现了它的生命周期的方法,并且保存了它的当前状态,杀死它所在的线程将对用户体验没有可见的影响,因为当用户退回到该activity时,此activity会恢复它所有可见的状态. 关于保存和恢复状态的信息请看Activities .

5.Empty process(空进程)

一个没有任何活动应用程序组件的进程. 保持这种类型的进程的唯一理由是为将来的动作缓存一个进程,从而可以改进在下次一个组件需要运行在它上面的启动时间. 系统会经常杀死这些进程,为的是在进程缓存和潜在核心缓存(underlying kernel caches)之间平衡系统资源.

根据当前在进程中活跃的组件的重要性,android可以将一个进程设置为最高层次. 比如,如果一个进程拥有一个service和一个可见的activity,进程会被设置为可视进程,而不是一个服务进程.

另外,因为其他进程依赖于它,一个进程的等级可能会被提高(一个进程为另一个进程服务的时候,该进程不能低于它所服务的进程的等级.) 比如,进程A中的一个content provider 正在服务于进程B中的客户端,或者如果进程A中的一个service与进程B中的一个组件绑定在一起,进程A总是被认为是至少和进程B一样重要的.

因为一个运行着service的进程的等级会比一个拥有后台 activities的进程高,与仅仅创建一个工作线程相比(特别是如果一个操作的持续时间比activity还长的时候),为一个长期执行的操作启动一个service可能会比用一个activity初始化它效果更好. 比如,一个正在上传一张图片到网络上的activity应该启动一个service来进行上传,因此即使用户离开了这个activity,上传操作依旧可以在后台继续. 使用一个service保证了该操作至少拥有‘service process’优先级,而不断activity发生了什么. 同理,broadcast receivers 也应该启动一个service,而不是简单地将耗时操作放在一个线程里.

译者注:
有关进程的翻译就到此为止了,下一次我将会继续翻译有关线程的内容,有什么不妥当的地方烦请各位指出,不甚感激.

最后,稍微总结一下上述的内容:

  • 首先是描述了进程的基本概念以及在android系统中的应用.
  • 然后描述了可以在manifest文件中利用android:process属性声明一个具体的进程.
  • 最后是本篇文章的重点内容:进程的生命周期,主要描述了进程生命周期中的五个层次:Foreground process、Visible process、Service process、Service process、Service process,以及他们之间具体是如何分层的.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值