2024年4月11日发(作者:)

android系统中的进程,任务,服务三者的区别和联系

Android应用程序模型:应用程序,任务,进程和线程

大多数操作系统,在应用程序所寄存的可执行程序映像(如Windows

系统里的.exe)、它所运行的进程以及和用户交互的图标和应用之间

有一种严格的1对1关系。在Android系统里,这些关联要松散得多。

并且重要的是要理解各种概念怎么样组成整体。

由于Android应用固有的灵活性,当实现这些不同方面的时候有一些

基本术语需要加以理解:

一个Android包 (.apk)文件,其中包含一个应用程序的代码和资

源。这是应用程序分发和下载的文件,用户用来安装该应用程序在他

们的设备上。

一个任务一般而言是指用户视为的一个可启动应用程序:通常任务在

桌面(home screen)有一个可访问的图标,且可以被切换到前台。

一个进程是一个运行着应用程序代码的底层核心过程。通常所有.apk

里的代码运行在一个专有的进程里。不过,进程标记也可以用来限定

代码运行位置,或者为整个.apk或者为个别的活动activity,接收

者receiver,服务或提供者provider,组件。

任务

这里的一个关键点是:当用户看到一个“应用”时,他们实际上在和

任务打交道。如果您刚刚创建一个包含若干活动的.apk,其中之一是

顶层入口点(通过动作的意图过滤器

intent-filter和类别ER),那么

这事实上将为您的.apk创建一个任务,并且您从那儿起动的任何活

动都将作为那个任务的一部分运行。

一个任务,那么,从用户的角度来看是您的应用程序;而从应用程序

开发者的角度来看,它是一个或多个用户在那个任务中已经经历过且

未关闭的活动,或者说是一个活动栈。一个新的任务通过以

_ACTIVITY_NEW_TASK标志起动一个活动意图来创建;这

一意图将被用来作为任务的根意图,定义任务是什么。任何不以这个

标志起动的活动将和起动它的活动在相同的任务中运行(除非该活动

已请求特别启动模式,稍后会讨论)。任务可以被重新安排:如果您

使用FLAG_ACTIVITY_NEW_TASK标志但已经有一个任务以这个意图运

行,则当前任务的活动栈将被切换到前台而不是开始一个新的任务。

FLAG_ACTIVITY_NEW_TASK必须谨慎使用:使用它意味着,在用户看

来,一个新的应用程序由此起动。如果这不是你所期望的行为,你就

不该去创建一个新的任务。另外,仅在用户可以从桌面返回到他原来

的地方和以一个新任务启动相同意图的情况下,你才应该使用新的任

务标记。否则,如果用户在你已经启动的任务里按桌面(HOME)键,

而不是返回(BACK)键,你的任务及其活动将被放置到桌面后面,没

有办法再切换回去。

任务共用性Affinity

在某些情况下,Android需要知道一个活动属于哪个任务即使它没有