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 ...
随机推荐
- 【转】linux 中dd命令使用详解
原文网址:http://xiaozhuang.blog.51cto.com/4396589/850657 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究 ...
- Google Map API 学习四
- PHP按最大宽高等比例缩放图片类
本来用phpthumb来缩略图片是十分方便的,但是最近在sae上写项目发现phpthumb在sae上保存文件时会出问题,想来实现一个简单的按最大宽高等比例缩放图片类也并不困难,于是便自己写了一个方便修 ...
- FAT32,NTFS,EXT3,支持的最大分区和单个文件大小?
FAT32 Filesystem: 最大单一档案大小 4GB 最大文件系统总容量 128GB NTFS Filesystem: 最大单一档案大小 64GB 最大文件系统总容量 2TB Ext3 Fil ...
- Unity3d 屏幕空间人体皮肤知觉渲染&次表面散射Screen-Space Perceptual Rendering & Subsurface Scattering of Human Skin
之前的人皮渲染相关 前篇1:unity3d Human skin real time rendering 真实模拟人皮实时渲染 前篇2:unity3d Human skin real time ren ...
- assembly的说明
Assembly SampleAssembly; // Instantiate a target object. Int32 Integer1 = new Int32(); Type Type1; / ...
- DOM方法
DOM常用方法: 方法 描述 getElementById() 返回带有指定 ID 的元素. getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组 ...
- hdu4348 - To the moon 可持久化线段树 区间修改 离线处理
法一:暴力! 让干什么就干什么,那么久需要可持久化线段树了. 但是空间好紧.怎么破? 不down标记好了! 每个点维护sum和add两个信息,sum是这段真实的和,add是这段整体加了多少,如果这段区 ...
- HDU 1231 (13.12.2)
Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i < ...
- Linux下安装 TestLink常见问题解决方法
Read/write permissions For security reason we suggest that directories tagged with [S] on following ...