在 Manifest 中对 Application或四大组件设置 android:process 属性可以为其分配独立的进程,同时设置了以组件属性为准。属性值(进程名称)可以随意定义,":xxx"以冒号开头表示进程私有其他APP无法访问,进程名称变成"包名:xxx"。
相同点 | 不同点 | |
进程 Process | 线程 Thread | |
- | 程序的一个运行实例。 | CPU调度的基本单位。 |
APP在启动的时候就开启了一个进程,默认情况下一个APP的所有组件都运行在同一进程和线程中。 | 进程是包名。 | 线程是主线程(UI进程)。 |
都是任务栈结构。 | 进程间相互独立具有独立的资源空间。 | 同一进程的各线程间资源共享。 |
- | 在 MainiFest 中对 Application 或四大组件进行 android:process 属性设置可以为其分配进程。 | 线程不是越多越好,最好是CPU个数+1。 |
二、重要级别
一个进程的优先级是可以变化的,当可用内存低的时候重要性低的进程先被杀死,前台进程 > 可视进程 > 服务进程 > 后台进程 > 空进程。
前台进程为数不多,只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应,这就需要依靠系统的调度。
用户当前操作所必需的进程。 | 1.正在交互的 Activity,即处于 onResume() 状态。 |
2.当某个 Service 绑定正在交互的 Activity。 | |
3.Service被主动调用为前台,即调用了 startForeground() 函数。 | |
4.Service正在执行 onCreate()、onStart()、onDestroy()。 | |
5.BroadcastReceiver 正在执行 onReceive()。 |
可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。
不在交互但仍然可见的进程。 | 1.Activity无法交互但仍然可见,即处于 onPause() 状态。 |
2.绑定到可见(前台)Activity 的 Service。 |
通过 startService() 方法启动的service,它不属于上面提到的2种更高重要性,所在的进程虽然对用户不是直接可见,但执行了用户非常关注的任务(比如播放mp3,从网络下载数据)。只要前台进程和可见进程有足够的内存,系统不会回收他们。
不可见的activity(即处于 onStop() 状态)。这些进程对用户体验没有直接的影响,可以在服务进程、可见进程、前台进程需要内存的时候回收。通常,统中会有很多不可见进程在运行,他们被保存在 LRU (least recently used) 列表中,以便内存不足的时候被第一时间回收。如果一个 activity 正确的执行了它的生命周期,关闭这个进程对于用户体验没有太大的影响。
不含任何活动组件的进程。目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。
如果App还存在缓存进程,这个时候启动App,应用Application的onCreate方法会执行吗?
点击返回键后系统执行 MainActivity 的 onDestory(),这个时候APP进程为缓存进程,下次启动APP会发现 Application 的 onCreate() 并不会执行,MainActivity的生命周期都会正常执行,这是因为从缓存进程启动APP,系统已经缓存了很多信息,很多数据并不会被销毁,onCreate() 中初始化的那些内容还在,方便用户下次快速启动。利用这一特性,我们的App首次启动速度一般为5-600ms,退出App后存在缓存进程的情况下,每次启动的速度一般为2-300ms,算是某种程度上提升了App的启动时间。