`
zhengjiong
  • 浏览: 69271 次
  • 性别: 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 Task 进程与线程详解

    关于Android中的进程和线程文档,看完后对 Android里面的Task概念有更深的了解。

    android 进程与线程 - 开发文档翻译 - 进程.doc

    android 进程与线程 - 开发文档翻译 - 进程

    进程与线程的生动形象理解

    该文档为进程与线程的生动详细地理解,个人认为讲的非常好。形象生动。

    Android下线程与进程

    Android下线程与进程,详细可以参见博客:http://www.cnblogs.com/plokmju/p/android_ProcessOrThread.html

    进程和线程有什么区别?

    线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程...

    Android进程结束杀掉子线程Demo

    http://blog.csdn.net/qq_28690547/article/details/50375997;关于demo的文章详解,有兴趣的童鞋可以看看,解决popupwindow/dialog的BadTokenException异常

    进程与线程 进程与线程

    为了描述程序在并发执行时对系统资源的共享,我们需要一个描述程序执行时动态特征的概念,这就是进程。在本章中,我们将讨论进程概念、进程控制和进程间关糸.

    Android 进程和线程

    在这个移动互联网新时代里,如果应用开发者具备更多的进程和线程知识,将能有更多空间与平台软件、硬件开发者沟通,这对创造开源、开放的Android应用软件系统是非常有帮助的。

    C++进程与线程详解

    鉴于网上和一些教材上对进程和线程说明不是很全面,在对这方面知识学习之后,进行了总结,对操作系统中进程与线程的关系和一些应用进行了整理,希望对有这方面需要的同道中人有所帮助。

    Android 中三种启用线程的方法总结

    首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...

    进程与线程的管理 .PPT 进程、线程和优先级

    进程、线程和优先级 工作线程和用户界面线程 线程同步 线程通讯

    进程和线程之间的关系

    详细讲解进程和线程之间的区别,方便初学者能更深透的理解

    c++进程与线程

    c++进程与线程,好东西,可以看看学习之用,值得看看!

    Android中的进程和线程

    Android中的进程和线程,新手入门教程,希望对大家有所帮助

    windows的进程与线程

    讲解windows下的进程与线程之间的关系和API函数的基本操作

    进程与线程_动力节点Java学院整理.

    进程与线程,本质意义上说, 是操作系统的调度单位,可以看成是一种操作系统 “资源” 。Java 作为与平台无关的编程语言,必然会对底层(操作系统)提供的功能进行进一步的封装,以平台无关的编程接口供程序员使用,...

    操作系统实验报告——线程与进程同步

    操作系统实验报告,原创,写得很认真的。 内容为进程与线程同步,有流程图及源代码等

    进程与线程的一个简单解释

    进程与线程的一个简单解释,教你简单区分程序设计过程中的进程与线程问题,有助于你对多线程编程的理解

    进程线程及死锁

    通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。

    c语言多进程多线程编程

    c语言多进程多线程编程

Global site tag (gtag.js) - Google Analytics