进程和线程

  当一个应用程序第一次启动的时候,Android会启动一个Linux进程和一个主线程(即UI线程:主要负责处理用户的按键事件、触屏事件及屏幕绘图事件等)。默认情况下,所有该程序的组件都将在该进程和线程中运行。同时,Android会为每个应用程序分配一个单独的Linux用户。Android系统视图尽可能长时间地保持应用程序进程,只有在内存资源不足时,Android会尝试停止一些进程从而释放足够的资源给其他新的进程使用,也能保证用户正在访问的当前进程有足够的资源去及时地响应用户的事件。Android会根据进程中运行的组件类别以及组件的状态来判断该进程的重要性,Android会首先停止那些不重要的进程。按照重要性从高到低一共有五个级别:

  前台进程

  前台进程是用户当前正在使用的进程。只有一些前台进程可以在任何时候都存在。它们是最后一个被结束的,当内存低到连它们也不能运行的时候,设备会进行内存调度,终止一些前台进程来保持对用户交互的响应。

  满足以下任一条件时,进程被视为前台进程:

  1.这个进程运行着一个正在和用户交互的Activity(这个Activity的onResume()方法被调用)。

  2.这个进程里有这样的一个Service,该Service绑定到了当前正在和用户交互的Activity。

  3.这个进程里有这样的一个Service,该Service正在执行生命周期的回调函数(onCreate(),onStart(),onDestory())。

  4.这个进程里有一个正在执行onReceive()方法的BroadCastReceiver。

  可见进程

  不包含前台组件但仍会影响用户在屏幕上所见内容的进程。满足以下任一条件就是可见进程:

  1.这个进程中包含一个不位于前台的Activity,但是仍然对用户是可见的(这个Activity的onPause()方法被调用)。

  2.这个进程里有一个绑定到一个可见的Activity的Service。

  服务进程

  此进程运行着一个通过startService()方法启动的Service,它不会升级为上述两个级别。尽管服务进程不直接和用户所见内容关联,但他们通常在执行一些用户关心的操作(比如在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台、可见进程同时运行,系统会保持服务进程的运行。

  后台进程

  运行着一个对用户不可见的Activity(调用onStop()方法),这些进程对用户体验没有直接影响,可以在服务进程、可见进程、前台进程需要内存的时候回收。通常,系统中会有很多不可见进程在运行,它们被保存在LRU(least recently used最近最少使用)列表中,内存不足时被第一时间回收,以确保最近被用户使用的Activity最后一个被终止。如果一个Activity正确执行了生命周期的方法,并保存了当前的状态,则终止此类进程不会对用户体验产生可见的影响。

  空进程

  不含任何活动应用组件的进程。保留这种进程的唯一目的就是用作缓存,缩短下次程序需要重新使用的启动时间。系统经常终止这些进程,这样可以调节程序缓存和系统缓存的平衡。

  

 Android对进程的重要性进行评级的时候,选取它最高的级别。例如,如果一个进程中含有个Service和一个可见的Activity,进程将被归入可见进程而不是服务进程。

 另外,当被另外一个进程依赖的时候,某个进程的级别可能会增高。一个为其他进程服务的进程永远不会比被服务的进程重要级低。因为服务进程比后台Activity进程重要级高,因此一个要进行耗时工作的Activity最好启动一个Service来做这个工作,而不是开启一个子进程——特别是这个操作需要的时间比Activity存在的时间还要长的时候。例如,后台播放音乐,向网上上传摄像头拍到的图片,使用Service可以使进程最少获取到“服务进程”级别的重要级,而不用考虑Activity目前是什么状态。BroadcastReceiver做费事的工作的时候,也应该启用一个服务而不是开启一个线程。在BroadcastReceiver的onReceive()方法里执行一些耗时的操作,该耗时操作不能在10s内执行完成,会弹出ANR对话框。如果确实需要根据Broadcast来完成一项比较耗时的操作,可以考虑通过Intent启动一个Service来完成该操作。不应该考虑使用新线程去完成耗时操作,因为BroadcastReceiver本身的生命周期很短,可能出现子线程还没有结束,BroadcastReceiver就已经退出了。

参考自:http://www.cnblogs.com/hanyonglu/archive/2012/04/12/2443262.html

  

Android的进程和线程(转)的更多相关文章

  1. Android 的进程和线程

    进程和线程 如果某个应用程序组件是第一次被启动,且这时应用程序也没有其他组件在运行,则android系统会为应用程序创建一个包含单个线程的linux进程.默认情况下,同一个应用程序的所有组件都运行在同 ...

  2. Android中进程与线程

    常说的主线程(UI线程)是什么? 当一个Android程序刚启动的时候,我们的android系统就会启动一个带有一个单一线程的linux进程.默认情况下,所有的组件比如Activity都运行在同样的一 ...

  3. 转:Android 的进程与线程总结

    当一个Android应用程序组件启动时候,如果此时这个程序的其他组件没有正在运行,那么系统会为这个程序 以单一线程的形式启动一个新的Linux 进程. 默认情况下,同一应用程序下的所有组件都运行再相同 ...

  4. Android中进程与线程及如何在子线程中操作UI线程

    1. Android进程 一个应用程序被启动时,系统默认创建执行一个叫做"main"的线程.这个线程也是你的应用与界面工具包(android.widget和android.view ...

  5. [转]Android进程与线程基本知识

    转自:http://www.cnblogs.com/hanyonglu/archive/2012/04/12/2443262.html 本文介绍Android平台中进程与线程的基本知识. 很早的时候就 ...

  6. Android--多线程之进程与线程

    前言 对于Android程序中,使用多线程的技术是必不可少的,就拿之前最简单的例子来说明,对于Android4.0+的应用而言,访问网络必须另起线程才可以访问.本片博客介绍Android下进程和线程, ...

  7. 实现在Android 进程和线程

    进程和线程 如果某个应用程序组件是第一次被启动,且这时应用程序也没有其他组件在运行,则Android系统会为应用程序创建一个包含单个线程的linux进程.默认情况下,同一个应用程序的所有组件都运行在同 ...

  8. Android开发-API指南-进程与线程

    Processes and Threads 英文原文:http://developer.android.com/guide/components/processes-and-threads.html ...

  9. Google Android官方文档进程与线程(Processes and Threads)翻译

    android的多线程在开发中已经有使用过了,想再系统地学习一下,找到了android的官方文档,介绍进程与线程的介绍,试着翻译一下. 原文地址:http://developer.android.co ...

随机推荐

  1. 排序算法简介及其C实现

    排序算法(Sorting Algorithm)是计算机算法的一个组成部分. 排序的目标是将一组数据 (即一个序列) 重新排列,排列后的数据符合从大到小 (或者从小到大) 的次序.这是古老但依然富有挑战 ...

  2. hdu 4717 The Moving Points(三分+计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717 说明下为啥满足三分: 设y=f(x) (x>0)表示任意两个点的距离随时间x的增长,距离y ...

  3. Jquery案例——某网站品牌列表的效果

    一下是效果图.点击"显示全部品牌",高亮推荐品牌,并显示全部品牌. HTML文件: <!DOCTYPE html> <html lang="en&quo ...

  4. w10 系统升级

    怎么把电脑升级到w10系统? 下载一个软件,Windows10Upgrade9252.exe, 5M左右,把windows更新开启后,运行即可! 升级后,请把windows.old 文件夹删除,这个文 ...

  5. css三角形绘制

    三角形演变: 1.将一个块元素的宽.高都设置为0,再设置边框样式,得如下效果图(绿色部分): 样式: {;;border: 35px solid #7de87d;} 通过此样式得到的是一个正方形. 2 ...

  6. UVA - 10785 The Mad Numerologist

    题目链接 这个题又犯了省题不清的错误.导致不停 wa.唉. 题目意思是给你一个长度L,然后和一张表相应每一个大写字母的value值.你须要依照一定规则找出长度为L的序列. 注意  序列的value值要 ...

  7. Shell脚本编程——了解你的Linux系统必须掌握的20个命令

    要想详细了解你的Linux系统,为系统评估和性能调化提供准确的信息,那么,你会经常用到这几组命令. 一. 系统信息     1. 查看内核版本.编译主机.编译器版本和编译时间的信息    cat /p ...

  8. hadoop2.2 伪分布式环境

    在安装JDK之前,请确认系统是32还是64,根据系统版本,选择JDK版本.Hadoop版本 下面是以在CentOS-6.5-x86_64系统上安装为例 安装前准备 在"/usr"下 ...

  9. Java语言基础(一)

    Java语言基础(一) 在这里说明一下,有基础的跳过 高手跳过.在这里我想复习以前的东西,以及给正在学java的一些帮助 我用的MyEclipse8.5编写java代码,有需要联系我  QQ:9035 ...

  10. (转载)linux那点事儿(上)

    原文地址:http://www.cnblogs.com/fnng/archive/2012/03/19/2407162.html 本文只是转载供自己学习之用 本文算是学linux的学习笔记吧!其实li ...