- 进程是程序的一个运行实例,线程是CPU调度的基本单位。
- 默认情况下一个APP的所有组件都运行在同一进程和线程中,这个进程是包名,线程是主线程(UI进程)。
- 线程和进程都是任务栈结构,进程间相互独立因此有独立的资源空间,同一进程的各线程间资源共享。
进程 Process | 进程具有独立的资源空间。APP在启动的时候就开启了一个进程。开发中在 MainiFest 中对 application 或者四大组件进行 android:process 属性设置,可以为其分配进程。 |
线程 Thread | 线程间能资源共享。默认情况下,同一应用程序的所有组件都运行在一个进程里面,当然也可以在Manifest里面配置一个Service在特定的进程里面去后台做一些操作。线程不是越多越好,最好是CPU个数+1。 |
- 一个进程的优先级是可以变化的,内存低重要性低的进程先被杀死,前台进程 > 可视进程 > 服务进程 > 后台进程 > 空进程。
- 一个Activity,它进入onStart和onPause时是可见进程,进入onResume时是前台进程,打开后点击Home键退到后台这个时候是Previous进程(后台进程),如果直接点击返回键退出Activity,这个时候是缓存进程。
前台进程 Foreground Process | 用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程: 通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应,这就需要依靠系统的资源。 |
可视进程 Visible Process | 没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。如果一个进程满足以下任一条件,即视为可见进程: 可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。 |
服务进程 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的启动时间。