• 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的启动时间。

  • 相关阅读:
    NX二次开发-使用MFC的CImage裁剪图片
    【002】数组少不了
    论文阅读——ELECTRA
    TCP 中的 Delay ACK 和 Nagle 算法
    高阶数据结构—— 哈希
    算法学习 day27
    Ompal138+Spartan-6 FPGA开发板硬件数据说明书(上)
    【博客552】git auto-merge原理以及auto-merge的不同模式
    纯Vue实现网页日常任务清单小功能(数据存储在浏览器)
    VS2019+QT5.12.9环境下,调试QString无显示解决
  • 原文地址:https://blog.csdn.net/HugMua/article/details/127711271