Android的进程和线程(转)
进程和线程
当一个应用程序第一次启动的时候,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的进程和线程(转)的更多相关文章
- Android 的进程和线程
进程和线程 如果某个应用程序组件是第一次被启动,且这时应用程序也没有其他组件在运行,则android系统会为应用程序创建一个包含单个线程的linux进程.默认情况下,同一个应用程序的所有组件都运行在同 ...
- Android中进程与线程
常说的主线程(UI线程)是什么? 当一个Android程序刚启动的时候,我们的android系统就会启动一个带有一个单一线程的linux进程.默认情况下,所有的组件比如Activity都运行在同样的一 ...
- 转:Android 的进程与线程总结
当一个Android应用程序组件启动时候,如果此时这个程序的其他组件没有正在运行,那么系统会为这个程序 以单一线程的形式启动一个新的Linux 进程. 默认情况下,同一应用程序下的所有组件都运行再相同 ...
- Android中进程与线程及如何在子线程中操作UI线程
1. Android进程 一个应用程序被启动时,系统默认创建执行一个叫做"main"的线程.这个线程也是你的应用与界面工具包(android.widget和android.view ...
- [转]Android进程与线程基本知识
转自:http://www.cnblogs.com/hanyonglu/archive/2012/04/12/2443262.html 本文介绍Android平台中进程与线程的基本知识. 很早的时候就 ...
- Android--多线程之进程与线程
前言 对于Android程序中,使用多线程的技术是必不可少的,就拿之前最简单的例子来说明,对于Android4.0+的应用而言,访问网络必须另起线程才可以访问.本片博客介绍Android下进程和线程, ...
- 实现在Android 进程和线程
进程和线程 如果某个应用程序组件是第一次被启动,且这时应用程序也没有其他组件在运行,则Android系统会为应用程序创建一个包含单个线程的linux进程.默认情况下,同一个应用程序的所有组件都运行在同 ...
- Android开发-API指南-进程与线程
Processes and Threads 英文原文:http://developer.android.com/guide/components/processes-and-threads.html ...
- Google Android官方文档进程与线程(Processes and Threads)翻译
android的多线程在开发中已经有使用过了,想再系统地学习一下,找到了android的官方文档,介绍进程与线程的介绍,试着翻译一下. 原文地址:http://developer.android.co ...
随机推荐
- Delphi调试CGI或ISAPI 转
因为dll文件已驻留内存,可用intrabob进行调试,也可用PWS进行调试,不过要换文件. IntraBob是资深程序员Dr.Bob编写的免费工具软件,用于测试Delphi编写 的CGI/Win ...
- 自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客
自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客 自动化运维工具Ansible详细部署
- chrome如何添加扩展程序xss encode
1.把相应格式(*.crx)的扩展程序直接拖入下面的界面即可(拖入浏览器的其他界面不行)
- UVa12171 hdu2771 UVaLive4291 Sculpture
填坑系列(p.171) orz rjl 代码基本和rjl的一样 #include<cstdio> #include<cstring> #include<cstdlib&g ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- UIButton图文上下对齐
- (void)centerImageAndTitle:(float)spacing { // get the size of the elements here for readability CG ...
- 转换 TColor 到 HTML 颜色串
//转换 TColor 到 HTML 颜色串 function ColorToHtml(color:TColor):string; var RgbColor : TColorRef; begin ...
- systemTAP 学习
http://blog.csdn.net/moonvs2010/article/category/1570309
- Java基础知识强化04:判断101~200之间有多少素数
1. 判断101~200之间有多少素数? package himi.hebao; /** * (1).编写函数isPrime()用来判断输入数据是否为素数 (2).遍历判断101~200之间的数据是否 ...
- iOS viewController 和 view 的创建消失生命周期总结
控制器创建的生命周期 1. 如果从stroryBoard 中产生一个controller,那么会先调用initWithCoder:, awakeFromNib, loadView,viewDidLoa ...