`
zhengjiong
  • 浏览: 71347 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多

Android系统会尽可能时间长的来维持一个程序的进程,但当系统资源紧张的时候,系统终究会为一些新的或者更重要的进程杀死一些旧的进程来释放内存。系统主要是根据进程中组件的运行状态,来决定每一个进程的重要性,从而决定哪个进程需要杀死,哪个进程需要保持。最不重要的进程最容易先被杀死,其次最不重要的进程会被杀死,以此往复,直到系统恢复了需要的资源。
既然系统主要根据进程的重要性来决定一个进程的存亡,下面我们就将介绍根据重要性分类的五种不同进程(重要性由高到低)。
1.foreground process,前台进程
所谓前台进程就是指用户完成当前工作而需要的进程。判断条件如下(满足其一即可):
-进程中的某个Activity正在与用户进行交互(ActivityonResume()方法被调用)
-绑定到与当前用户正在交互的activityService所在的进程
-进程中的某个Service正运行在前台,即这个servicestartForeground()方法被调用
-进程中的某个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-可保持线程日志统一输出多线程不混乱

    5. **日志队列**:可以创建一个线程安全的队列,线程将日志消息放入队列,然后由单独的线程负责从队列中取出并输出,确保日志输出的顺序性和一致性。 6. **异步日志处理**:使用Handler或者AsyncTask等机制,将日志...

    Android中多线程下载原理实现案例

    在Android开发中,多线程下载是一项常见的技术,它能够显著提高大文件的下载效率,尤其是在网络环境不稳定或带宽有限的情况下。本案例主要探讨了Android中如何利用多线程来实现高效、稳定的文件下载。 首先,理解多...

    Android多线程处理.pdf

    这五个级别的划分基于进程的重要性,系统会优先保留级别高的进程,以保证用户体验。 单线程模型要求所有UI操作都在主线程中执行,但这也意味着耗时操作如网络请求、数据库操作等如果在主线程中执行,将会阻塞UI更新...

    Android多线程处理[归类].pdf

    进程按其重要性分为五个级别:前台进程、可见进程、服务进程、后台进程和空进程。这些级别的划分决定了Android系统在内存不足时优先结束哪些进程。前台进程和可见进程具有最高的优先级,而后台进程和服务进程则相对...

    Android Handle Thread.docx

    Android对进程有五个不同的重要性级别:前台进程、可见进程、服务进程、后台进程和空进程。这些级别的划分主要依据进程内组件的类型和状态,以便系统在内存紧张时优先处理重要进程。例如,前台进程(如正在运行的...

    Android_Handle_Thread

    进程的重要性分为五个等级:前台进程、可见进程、服务进程、后台进程和空进程。这五个级别的划分基于进程内组件的类型和状态,用于优化内存管理。例如,前台进程是用户当前正在使用的,系统会尽可能保留;而后台进程...

    多线程网络下载

    在Android系统中,由于其资源的限制和用户对于快速响应的需求,多线程下载显得尤为重要。本篇将深入探讨多线程网络下载的原理、实现方式以及在Android平台上的应用。 首先,我们需要理解什么是多线程。线程是操作...

    百度Android工程师面试题.pdf

    DVM是在Linux内核中作为一个进程存在的,因此可以说Android应用进程与Linux进程在概念上是相同的。 2. **SIM卡的EF文件** SIM卡的EF文件是其文件系统的一部分,遵循特定规范,用于与手机进行通信。这些文件存储...

    百度android面试题

    段式管理则按逻辑单元划分内存,提高代码的可读性和可维护性;段页式结合了两者的优点,提供更灵活的内存访问和保护机制。这些技术通常依赖于MMU(Memory Management Unit)硬件,实现虚拟地址空间的转换,优化内存...

    Android面试题集2020版(包含答案整理)第二部分1

    - 为了保证安全性和独立性,Android进程是相互独立且隔离的。当进程间需要通信时,这就涉及到IPC。传统IPC方式需要数据两次拷贝,但Binder机制利用内存映射技术,只需一次拷贝,提高了效率。 3. **Binder跨进程...

    百度android工程师面试题

    Android DVM、Linux进程与应用程序进程的概念辨析 DVM,即Dalvik Virtual Machine,是Android系统中专为Android设计的虚拟机,每个Android应用程序都在其自己的进程中运行,拥有独立的Dalvik虚拟机实例。这意味着...

    android面试题.zip

    - ANR(Application Not Responding)避免策略,理解主线程的重要性。 - 使用内存分析工具检测内存泄漏,避免对象无用引用。 - 使用Systrace、TraceView或Android Profiler分析应用性能瓶颈。 6. **网络编程**:...

    面试题android

    【Android DVM 进程与 Linux 进程...以上是针对给定文件内容的扩展解释,涵盖了Android进程、SIM卡文件系统、内存管理、实时操作系统、短信格式、动画机制、线程通信、MVC模式以及Activity生命周期等多个方面的知识点。

    百度android开发面试题

    Android DVM、Linux 进程与应用程序进程的关系 在Android环境中,DVM(Dalvik虚拟机)是为Android平台设计的虚拟机,每个Android应用都在其自己的进程中运行,并拥有独立的DVM实例。这意呸着每个应用都有自己的...

    Android+开发面试题

    - Handler机制是Android中处理线程间通信的重要方式之一。 - Looper类用于管理特定线程内的消息队列(Message Queue)。 - Handler对象用于与Looper对象通信,向消息队列发送消息或将消息从消息队列中取出。 - ...

    多线程设计

    总结来说,多线程设计是现代软件开发中不可或缺的一部分,理解和掌握UI线程与工作线程的划分以及线程通信机制,对于编写高效、稳定的多线程应用程序至关重要。通过分析和学习提供的代码示例,开发者可以深化对这些...

    Android底层架构研究

    对于Android底层架构而言,这包括但不限于进程、线程、服务、Binder驱动、IPC、HAL等。熟悉这些概念是深入研究的基础,它们构成了理解Android系统内部运作机制的词汇表。 ### **3. 手机之硬件形态** 硬件形态是...

    android面试题.doc

    Android面试题涵盖了许多核心知识点,包括Android系统的架构、内存管理、操作系统类型、短信规范、动画机制、线程通信以及设计模式的应用。以下是这些面试题所涉及的详细知识点: 1. **Android DVM与Linux进程**: ...

    Android培训机构教程大纲

    - **Intent的作用与目的**:解释Intent在Android系统中的重要性及其基本用途。 - **Intent的属性讲解**:解析Intent对象的组成部分及其意义。 - **定义与解析Intent**:介绍直接Intent与间接Intent的概念及其实现...

Global site tag (gtag.js) - Google Analytics