进程和线程

  当一个应用程序第一次启动的时候,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. 初遇ping++

    运行遇到的bug java.lang.NoClassDefFoundError: Failed resolution of: Lcom/pingplusplus/android/PingppLog; ...

  2. 关于java、Android中Math的一些用法

    java.math.Math类常用的常量和方法: Math.PI 记录的圆周率Math.E记录e的常量Math.abs 求绝对值Math.sin 正弦函数 Math.asin 反正弦函数Math.co ...

  3. rspec学习01

    1.安装rspec 2.基本构造 rspec用关键字describe和it,所以我们可以象正常会话一样去表达一个想法. describe方法创建了一个用例组,在describe所在的代码块里,你可以用 ...

  4. c语言中static的语义

    1.static变量: 1).局部 a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用.退出该函数后, 尽管该变量还继续存在,但不能使用它. b.对 ...

  5. C++ —— 时间与日期

    导读 在平时编程中有时需要获取当前的时间或者日期,然而不同的平台不同的场景下,有时使用的API也不尽相同.一般来说,C/C++中关于时间的标准库函数在不同的平台的都可以使用,可一些与平台相关的函数就只 ...

  6. in_array严格模式和普通模式的区别

    貌似是因为test转整型变0  0和0 匹配能成功 返回真 启用严格模式发现没有这个问题

  7. c#基础语言编程-装箱和拆箱

    引言 为什么有装箱和拆箱,两者起到什么作用?NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对 ...

  8. JBoss 系列十一:JBoss Cluster Framework Demo 介绍

    内容概要 JBoss Cluster Framework Demo包括JGruops.JBossCache.Infinispan,我们在随后的系列中会使用和运行这些示例来说明JGroups.JBoss ...

  9. android中选择控件与选择界面自然过度效果的实现--一种新的交互设计

    转载请标明出处: http://blog.csdn.net/jianghejie123/article/details/40648931 在安卓中经常遇到须要选择一个东西的功能,比方选择日期.选择文件 ...

  10. [RxJS] Combination operator: zip

    CombineLatest and withLatestFrom are both AND-style combination operators. In this lesson, we will l ...