进程和线程

  当一个应用程序第一次启动的时候,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. js或者cs代码拼接html

    一:使用到的jQuery 文档操作方法 html() 设置或返回匹配的元素集合中的 HTML 内容. append() 向匹配元素集合中的每个元素结尾插入由参数指定的内容. empty() 删除匹配的 ...

  2. C#操作Active Directory(AD)详解

    1. LDAP简介 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门 ...

  3. Node.js学习(12)----Web应用开发

    1.使用http模块 Node.js 由于不需要另外的 HTTP 服务器,因此减少了一层抽象,给性能带来不少提升, 但同时也因此而提高了开发难度.举例来说,我们要实现一个 POST 数据的表单,例如: ...

  4. wiki 的捐款呼吁有感而发

    今早在维基百科上查东西时,网页的最上角出现了一栏小广告,我一看居然是维基创始人发的捐款呼吁,点开后网页内容如下: “     来自维基百科创办者Jimmy Wales的个人呼吁 ----------- ...

  5. 403. Frog Jump

    做完了终于可以吃饭了,万岁~ 假设从stone[i]无法跳到stone[i+1]: 可能是,他们之间的距离超过了stone[i]所能跳的最远距离,0 1 3 7, 从3怎么都调不到7: 也可能是,他们 ...

  6. pomelo 服务器之间的通信

    master服务器在启动的时候会启动mater服务,生成一个MasterAgent,作为中心服务器. 然后所有服务器,包括mater服务器,都会启动monitor服务,生成一个MonitorAgent ...

  7. Linux命令 — 设置或查看网络配置命令ifconfig

    ifconfig命令用于设置或查看网络配置,包括IP地址.网络掩码.广播地址等.它是linux系统中,使用频率最高的关于网络方面的命令. 1. 命令介绍 命令格式: ifconfig [interfa ...

  8. Nginx系列~负载均衡服务器与WWW服务器的实现

    上两讲主要是关于Nginx的环境的介绍,没有涉及到真正环境的开发,这次我们以一个实现的例子,来说明一下负载均衡服务器与WWW服务器的Nginx是如何配置的,并最终如何实现的. 如下是一个实际场景,一台 ...

  9. iOS-UITableCell详情

    iOS-UITableCell详情 表示UITableViewCell风格的常量有: UITableViewCellStyleDefault UITableViewCellStyleSubtitle ...

  10. 如何判断JDK是32位还是64位

    第一种方法 在CMD窗口中使用java -version 命令进行查看 如果是64位的则会显示 Java HotSpot<TM>64-Bit 字样,32位的则没有类似信息. 注:这是Sun ...