当一个应用程序组件启动并且应用还没有运行任何其他组件时,Android系统会给应用程序启动一个新的带有单一执行线程的Linux进程。默认情况下,同一应用程序的所有组件都运行在相同的进程和线程(被叫做“主”线程)中。如果应用程序组件启动,并且针对这个应用的进程已经存在(因为应用程序中的其他组件的存在),那么这个组件就会在应用对应的进程中被启动,并且使用相同的执行线程。但是你能够安排应用程序中不同的组件运行在各自的进程中,并且你能够给任意进程创建额外的线程。
本文档讨论Android应用程序中进程和线程是怎样工作的。
进程
默认情况下,同一应用程序的所有组件都运行在同一进程中,并且大多数应用程序都不应该改变这种模式。但是,如果你发现需要控制某个组件属于哪个进程时,你能够在清单文件中做这件事情。
对于每种类型组件的清单入口元素---<activity>、<service>、<receiver>、和<provider>,都支持一个android:process属性,它能够指定组件应用应该运行在哪个进程中。你能够设置这个属性,以便每个组件运行在它自己的进程中,或者让某些组件共享一个进程,而其他的不共享。你也能够设置android:process属性以便不同应用程序的组件运行在同一个进程中---提供应用程序共享的相同的Linux用户ID和相同的证书签名。
<application>元素也支持一个android:process属性,用于设置应用程序所有组件的默认值。
当系统内存低并且启动进程要求立即服务用户的时候,Android系统可以决定在某个时点关掉一个进程,运行在这个进程中的应用程序组件也会因进程被杀死而销毁。当用户再次要求被杀死的进程为其工作时,这对这些组件的进程会再次被启动。
当要决定要杀死哪个进程时,Android系统会权衡它们对用户的重要性。例如,跟持有可见Activity的进程相比,系统更容易关掉持有不在屏幕上显示的Activity的进程。因此,要决定是否终止一个进程,依赖与那个进程中组件的运行状态。以下讨论用于决定终止哪个进程的规则。
进程的生命周期
Android系统会尝试尽可能长维护一个应用程序进程,但是最终为了给新的或更重要的进程回收内存时要删除旧的进程。要决定哪个进程要保留,哪个进程要杀死,系统会基于进程中运行的组件和这些组件的状态把每个进程放到一个“重要性层次表中,带有最低重要性的进程会首先被销毁,然后是下一个最低重要的,依次类推,直到系统回收到了需要的资源。
在重要性层次中有五个级别。以下按照重要性的顺序列出了不同类型进行的表现(第一种类型进程是最终的并且在最后被杀死):
1.前台进程
前台进程是用户当前作业必须的一个进程。一个进程满足以下任何条件都被认为是前台进程:
A.进程持有一个正在跟用户交互的Activity对象(Activity的onResume()方法已经被调用);
B.进程持有一个正在跟用户交互的Activity绑定的Service对象;
C.进程持有一个正在前台运行的Service对象---这个Service已经调用了startForeground()方法;
D.进程持有正在执行生命周期的一个回调方法的Service对象(onCreate()、onStart()、或onDestroy());
E.进程持有一个正在执行onReceive()方法的BroadcastReceiver对象。
一般情况,在给定的时间只有很少的前台进程存在。杀死这些进程只是要采取的最后手段---如果内存很低导致它们不能继续运行。在这个时点,设备已到达内存的饱和状态,因此必须杀死一些前台进程来保持对用户界面的响应。
2.可见进程
可见进程是指没有任何前台组件的一个进程,但是仍然能够影响用户在屏幕上看到的内容。如果满足下列条件之一,进程被认为是可见的:
A.进程持有一个不在前台的Activity,但是这个Activity依然对用户可见(它的onPause()方法已经被调用)。这是可能发生的,如果前台程序启动一个对话框,允许在这个对话框的后面看到之前的那个Activity。
B.进程持有一个绑定到一个可见(或前台)的Activity的Service。
一个可见进程被认为是非常重要的,并且只有在要求保留所有前台正在运行的进程时才可以杀死这种类型的进程。
3.服务进程
服务进程是指用startService()方法启动的正在运行的一个服务的进程,并且这个进程没有被归入上面介绍的两个分类。虽然服务进程不直接跟用户看到的任何东西捆绑,但是,通常他们都在做用户关心的事情(如在后台播放音乐,或下载网络上的数据),除非用来保留跟它们一起的所有前台和可见进程的内存不足,否则系统会一直保留它们。
4.后台进程
后台进程是指持有一个用户当前不可见的Activity的进程(这个Activity的onStop()方法已经被调用)。这些进程不会直接影响用户体验,并且为了给前台、可见、或服务进程回收内存,系统能够在任何时候杀死它们。通常会有很多后台进程在运行,因此它们被保留在一个LRU(Least recently used)列表中以确保用户最近看到的那个带有Activity的进程最后被杀死。如果一个Activity正确的实现了它的生命周期方法,并且保存了当前的状态,那么杀死它的进程将不会影响用户的视觉体验,因为返回到这个Activity是,这个Activity会恢复所有的可见状态。
5.空进程
空进程是指不持有任何活动的应用程序组件的一个进程。保留这种进程存活的唯一原因是为了缓存的目的,以便提高需要在其中运行的组件的下次启动时间。为了平衡进程缓存和基础内核缓存之间的整体系统资源,系统会经常杀死这些进程。
Android能基于进程中当前活跃的组件的重要性来安排一个进程的级别(选择其中优先级最高的作为进程的级别)。如,如果一个进程持有一个Service和一个可见的Activity,那么这个进程就会被安排到可见进程而不是服务进程。
另外,一个进程的排名可能因为其他进程的依赖而上升---一个正在服务另一个进程的进程,它的排名不会比它所服务的那个进程低。例如,进程A中的一个内容提供器服务与客户端进程B,或者进程A中的一个服务绑定了进程B中的一个组件,那么进程A始终被认为比进程B重要。
因为运行服务的进程的排名要比带有后台Activity的进程高,因此启动一个长时操作的Activity时可能为此操作启动一个服务,而不是简单的创建一个工作线程---尤其是这操作很可能长久用于这个Activity时。例如,给一个网站上传图片的Activity就应该启动一个执行上传功能的服务,以便上传能够在后台持续工作,即使用户离开了这个Activity。同样的原因,Broadcast Receiver应该采用服务而不是简单的放在一个耗费操作时间的线程中。
分享到:
相关推荐
Android进程和线程是Android应用程序运行的基础,理解这两个概念对于开发高质量的Android应用至关重要。在Android系统中,每个应用都是一个独立的Linux进程,这意味着它们在各自的沙箱环境中运行,互不影响,提高了...
Android 中的进程和线程概念是紧密相连的,一个进程可以包含多个线程,每个线程都可以执行不同的任务。在 Android 中,进程和线程的概念是动态运行的,会关心 Task 的概念。Task 的概念是 Android 中的主要概念,...
在Android系统中,进程和线程是应用程序运行的基础,它们决定了程序如何管理和执行任务。深入理解这两个概念对于优化应用性能、提高用户体验至关重要。 首先,我们要明白什么是进程。在计算机科学中,进程是程序的...
本项目通过一个Gradle项目展示了如何实现这一功能,并提供了`adb shell ps -t -p -c`命令来查看系统中线程和进程的CPU绑定情况。 首先,我们需要理解安卓系统中的进程和线程概念。在安卓系统中,每个应用都是一个...
http://blog.csdn.net/qq_28690547/article/details/50375997;关于demo的文章详解,有兴趣的童鞋可以看看,解决popupwindow/dialog的BadTokenException异常
Android进程和线程详解.当启动一个应用程序组件时,如果该应用没有正在运行的其它程序组件,那么Android系统将为这个应用创建一个新进程(包含一个线程)用于运行应用。 当启动一个应用程序组件时,如果该应用没有...
在Android系统中,线程(Thread)和进程(Process)是理解应用程序运行机制的关键概念。它们决定了应用如何分配资源和执行任务,对于优化性能、提高用户体验具有重要意义。 **线程** 线程是程序中的执行流,是操作...
总结,Android的进程和线程管理是一个关键的设计元素,它影响着应用的性能、响应性和安全性。开发者需要根据具体需求合理规划组件的进程分配,同时充分利用多线程技术来提升用户体验。理解并熟练掌握这些概念和实践...
总之,有效管理多线程环境下的日志输出是Android开发中的一个重要技巧,这不仅有助于调试,也有利于后期的问题排查和性能优化。`yyb-log-master`可能提供的解决方案,就是针对这一问题的一种实践,它可能包含了上述...
在Android系统中,进程和线程是应用程序执行和资源管理的核心概念。这篇文章主要阐述了Android应用如何使用进程和线程,以及系统如何管理和优化这些资源。 首先,Android系统中的进程有五种不同的生命周期状态,...
线程进程的区别于联系,详细介绍.希望对大家有用。如果有不足的地方,麻烦留言。
Android作为一种的、承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介绍Android中的进程、线程以及相关的技术问题。 进程和线程的基本概念 当一个应用...
在Android应用开发中,理解应用程序模块、任务(Tasks)、进程(Processes)和线程(Threads)的概念至关重要。这些组件是构建高效、响应且资源管理良好的应用程序的基础。 1. **应用程序模块(Application Modules...
首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...
在Android平台上,多线程下载是一项重要的技术,它允许应用程序同时从服务器获取数据,从而显著提高了文件下载的速度和效率。本教程将深入讲解如何在Android环境中实现多线程下载功能,以及涉及的相关知识点。 首先...
在计算机系统中,进程和线程是执行程序的基本单元。进程是系统资源分配的基本单位,而线程则是调度和执行的基本单位。当我们谈论"线程/进程绑定CPU代码"时,我们通常指的是通过编程手段将特定的进程或线程与特定的...
在Android系统中,线程和进程是两个关键概念,它们对于理解应用程序的执行环境和多任务处理至关重要。本文将深入探讨Android线程和进程的工作原理,以及如何在Android应用程序开发中正确地使用它们。 首先,Android...
在Android系统中,进程和线程的通信是应用程序运行的核心组成部分。Android系统为每个应用程序启动一个单独的Linux进程,这个进程在默认情况下承载了应用程序的所有组件,如Activity、Service等。每个应用程序至少有...