Android的进程与线程(2)按重要性划分等级的5种进程

简介: Android系统会尽可能时间长的来维持一个程序的进程,但当系统资源紧张的时候,系统终究会为一些新的或者更重要的进程杀死一些旧的进程来释放内存。
Android 系统会尽可能时间长的来维持一个程序的进程,但当系统资源紧张的时候,系统终究会为一些新的或者更重要的进程杀死一些旧的进程来释放内存。系统主要是根据进程中组件的运行状态,来决定每一个进程的重要性,从而决定哪个进程需要杀死,哪个进程需要保持。最不重要的进程最容易先被杀死,其次最不重要的进程会被杀死,以此往复,直到系统恢复了需要的资源。
既然系统主要根据进程的重要性来决定一个进程的存亡,下面我们就将介绍根据重要性分类的五种不同进程(重要性 由高到低)。
1.foreground process,前台进程
所谓前台进程就是指用户完成当前工作而需要的进程。判断条件如下(满足其一即可):
- 进程中的某个 Activity 正在与用户进行交互( Activity onResume() 方法被调用)
- 绑定到与当前用户正在交互的 activity Service 所在的进程
- 进程中的某个 Service 正运行在前台,即这个 service startForeground() 方法被调用
- 进程中的某个 Service 正在执行生命周期回调方法(比如, onCreate() onStart() ,或者 onDeatroy()
- 进程中的 BroadcastReceiver 正在执行 onReceive() 方法。
一般来说的话,在某特定时刻,也仅会有为数不多的几个前台进程。这些前台进程的重要性最高,当系统内存低到很低,以致不能继续运行这些所有的进程的话,系统将会杀死这些进程。这种情况下,一般是指系统已经到了一个极限边缘了,所以为了让 UI 继续有反应的话,系统不得不杀死一些前台进程。
2.可视进程-visible process
可视进程是指没有前台运行的组件,但仍然会对用户在屏幕看到的内容造成影响的进程。满足下面条件的进程都可以算作可视进程:
- 进程运行的 Activity 不在前台,但仍然是可见的(调用了 onPause() 方法)。这种情况可能是这样的,正在前台运行的 Activity 启动了一个对话框,这个对话框悬浮在这个 activity 之上,但仍有部分可见。
- 进程中的 Service 绑定到了一个可视(或前台)的 activity (该 activity 已调用了 onPause() 方法)。
可视进程也是有着极高重要性的进程,只有在系统为了保持前台进程运行而不得不杀死可视进程的时候,才会杀死可视进程。
3.服务进程-service process
所谓的服务进程,就是指除了上面两种进程外,如果一个进程已经通过 startService() 方法启动了一个 service 的进程。虽然这种 service 进程跟用户的看到的内容不相关,但它们所做的工作也是用户关心的(比如在后台播放音乐或者正在下载互联网上的资源),系统会一直保持服务进程,除非系统为了前台进程和可视进程的运行,而不得不杀死服务进程。
4.后台进程-background process
后台进程是指进程中的 activity 当前对用户来说不可见(这个 activity 调用了 onStop() 方法)。后台进程不会对用户的体验造成任何影响,并且系统可以在前台进程、可视进程、服务继承需要内存资源的时候会杀死后台进程。通常会有很多后台进程运行,并且这些后台进程保存在一个最近使用列表中,这样做的好处就是保证用户最近看到的进程最后被杀死。如果一个 activity 已经正确的实现了生命周期方法,并且保存了当前的状态,那么系统杀死这些后台进程对用户的可视效果来说的话,没有任何影响,因为当用户返回回来的时候,这个 activity 已经保存了所有的可视状态。
5.空进程-empty process
一个空进程没有任何运行的程序组件。系统保持空进程存在的唯一原因就是为了 缓存方面的考虑,这样做主要是为了提高组件的启动时间。系统经常会杀死这些空进程来保持整个系统资源和内核缓存之间的平衡。
Android 根据进程中运行的最重要的组件进行划分进程的重要性,比如说,如果一个进程中即有一个可视的 activity ,又有一个 service ,那么这个进程应该属于可视进程而不是服务进程。
另外,一个进程的重要性等级可能会因为依赖于该进程的其他进程而提高——一个服务于其他进程的重要性不会低于被服务的进程。比如说,进程 A 中的一个 content provider 正在为进程 B 中的客户服务,或者进程 A 中的一个 service 被绑定到了进程 B 中的一个组件,那么进程 A 的重要性至少会被认为是和 B 的重要性是一样的。
因为 一个正在运行的服务所在的进程的重要性高于一个处于后台的activity 所在的进程所以根据这一点,如果一个 activity如果要执行需要长时间运行的操作的话,这个activity 最好为该操作启动一个新的服务,而不是仅仅创建一个工作线程,尤其是当这个工作线程运行的时间可能比该 activity 的运行时间还长的时候。比如说,如果一个 activity 要往一个网站上上传一张图片的话,这个 activity 就应该启动一个服务来完成这个上传操作,这要做的好处就是即使用户离开了当前的这个 activity ,上传服务还会继续进行。使用一个服务保证一个进程至少还有服务进程这个优先级,而不用担心 activity 会发生什么情况。这也正是为什么广播接收者应该使用服务而不是把耗时的操作放在一个线程中的原因。
参考文档:http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html

下一篇将继续介绍android线程的相关知识。

相关文章
|
1月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
3月前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
65 1
|
9天前
|
消息中间件 调度
如何区分进程、线程和协程?看这篇就够了!
本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
42 11
|
8天前
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
26 6
|
1月前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
70 6
|
1月前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
70 5
|
1月前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
1月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
67 4
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。

热门文章

最新文章

  • 1
    Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
  • 2
    2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
  • 3
    从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
  • 4
    [JavaEE]———进程、进程的数据结构、进程的调度
  • 5
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
  • 6
    【03】优雅草央千澈详解关于APP签名以及分发-上架完整流程-第三篇安卓APP上架华为商店后面的步骤-华为应用商店相对比较麻烦一些-华为商店安卓上架
  • 7
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 8
    【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 9
    Java多线程编程秘籍:各种方案一网打尽,不要错过!
  • 10
    JAVA线程池有哪些队列? 以及它们的适用场景案例
  • 相关实验场景

    更多