Android - 进程

一、概念

  • 进程是程序的一个运行实例,线程是CPU调度的基本单位。
  • 默认情况下一个APP的所有组件都运行在同一进程和线程中,这个进程是包名,线程是主线程(UI进程)。
  • 线程和进程都是任务栈结构,进程间相互独立因此有独立的资源空间,同一进程的各线程间资源共享。

进程

Process

进程具有独立的资源空间。APP在启动的时候就开启了一个进程。开发中在 MainiFest 中对 application 或者四大组件进行 android:process 属性设置,可以为其分配进程。

线程

Thread

线程间能资源共享。默认情况下,同一应用程序的所有组件都运行在一个进程里面,当然也可以在Manifest里面配置一个Service在特定的进程里面去后台做一些操作。线程不是越多越好,最好是CPU个数+1。

二、进程的优先级

  •  一个进程的优先级是可以变化的,内存低重要性低的进程先被杀死,前台进程 > 可视进程 > 服务进程 > 后台进程 > 空进程。
  • 一个Activity,它进入onStart和onPause时是可见进程,进入onResume时是前台进程,打开后点击Home键退到后台这个时候是Previous进程(后台进程),如果直接点击返回键退出Activity,这个时候是缓存进程。

前台进程

Foreground Process

用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程:
    1.托管用户正在交互的 Activity(已调用 Activity 的 onResume() 方法)。
    2.托管某个 Service,后者绑定到用户正在交互的 Activity。
    3.托管正在“前台”运行的 Service(服务已调用 startForeground())。
    4.托管正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())。
    5.托管正执行其 onReceive() 方法的 BroadcastReceiver。

通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应,这就需要依靠系统的资源。

可视进程

Visible Process

没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。如果一个进程满足以下任一条件,即视为可见进程:
    1.托管不在前台、但仍对用户可见的 Activity(已调用其 onPause() 方法)。例如,如果前台 Activity 启动了一个对话框,允许在其后显示上一 Activity,则有可能会发生这种情况。
    2.托管绑定到可见(或前台)Activity 的 Service。

可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。

服务进程

Service Process

运行着一个通过startService()方法启动的service,这个service不属于上面提到的2种更高重要性的。service所在的进程虽然对用户不是直接可见的,但是他们执行了用户非常关注的任务(比如播放mp3,从网络下载数据)。只要前台进程和可见进程有足够的内存,系统不会回收他们。

后台进程

Background Process

运行着一个对用户不可见的activity(调用过 onStop() 方法).这些进程对用户体验没有直接的影响,可以在服务进程、可见进程、前台进 程需要内存的时候回收。通常,系统中会有很多不可见进程在运行,他们被保存在LRU (least recently used) 列表中,以便内存不足的时候被第一时间回收。如果一个activity正 确的执行了它的生命周期,关闭这个进程对于用户体验没有太大的影响。

空进程

Empty Process

不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。

三、面试

①如果App还存在缓存进程,这个时候启动App,应用Application的onCreate方法会执行吗?

如果你点击主界面MainActivity,点击返回键后系统执行MainActivity的onDestory方法,这个时候App进程为缓存进程,下次启动App你会发现Application的onCreate方法并不会执行,当然MainActivity的生命周期都会正常执行,这是因为从缓存进程启动App,系统已经缓存了很多信息,很多数据并不会被销毁,onCreate中初始化的那些内容还在,方便用户下次快速启动。利用这一特性,我们的App首次启动速度一般为5-600ms,退出App后存在缓存进程的情况下,每次启动的速度一般为2-300ms,算是某种程度上提升了App的启动时间。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值