您的位置:首页 > 其它

翻译SDK文档Tasks and Back Stack

2011-07-21 16:54 162 查看
、术语解释1.task:一系列activity的集合,这些activity就可以看成是一个任务。2.back stack:一系列activity的存储结构,因其遵循后进先出的原则,所以我个人译为“回退堆栈”,但本文仍沿用英文代表其原义。   二、相关文档     1./article/4456301.html 2.http://www.iteye.com/topic/1111875    3./article/6915217.html    一个应用程序通常包含多个Activity,每一个Activity都有它自己的功能并且可以启动其他的Activity,例如:一个邮件的应用程序可能有一个Activity现实它的最新邮件,当用户选择一个邮件的时候启动一个新的Activity来显示这个电子邮件。    一个Activity甚至可以打开在这个设备上的不同应用程序的Activity,例如,如果您的应用程序要发送一封电子邮件,你可以定义一个执行“发送”的行动,其中包括一些数据,如电子邮件地址和邮件的内容。一个可以从其它程序打开的Activity要再Manifest声明启动它的Intent的种类。在这种情况下,你是要发送一封电子邮件,那么电子邮件应用程序的撰写Activity将被启动(如果系统注册了多个同样的Intent,用户可以选择使用哪一个)当电子邮件发送,您的应用程序中的Activity将可见,这样看起来似乎发送邮件是您应用程序的一部分,即使Activity可以从不同的应用启动,Android的保持这种无缝的用户体验,这两个Activity在同一个Task里面。一个Task是收集用户执行某些工作时,互动的Activity。Activity被安排在一个stack (“back stack”),其中的顺序是Activity打开的顺序。设备的Home Screen 是大多数Task的起始位置。当用户触摸图标在Main Menu(或在主屏幕上的快捷方式),该应用程序的Task会被推到前台。如果没有该应用程序的Task(应用程序尚未最近使用)存在,则创建一个新的Task,应用程序的"main"Activity将作为该Task的根。如果当前显示的Activity打开另外一个Activity,那么这个新打开的Activity将会被放置到Task的顶部,并且获取焦点,上一个activity仍然在堆栈中,但是已经被stop,但是系统会保持这个Activity的当前状态。当用户按下BACK键,当前的Activity是从堆栈的顶部移除并且销毁,上一个Activity将会被显示(恢复以前保存的状态)。Activity所在的堆栈永远都不会重新排列,只有进栈和出栈,用户启动一个Activity时进栈,Back时出栈。因此Back stack准守“先进后出”的原则。下图介绍了大概的流程:图1。一个代表性的每个Activity如何增加到Task。当用户按下BACK键,当前活动被删除并销毁,并恢复到以前的activity。如果你继续点击Back键,那么当前显示的Activity都将被移除,并且显示前一个Activity,直到用户返回到Home Screen,当所有的Activity都从Task中移除,这个Task也将被销毁。一个Task是一个被凝聚的单元,他可以被整体移动到后台,当用户开启了一个新的Task或者用户通过Home键返回到Home Screen的时候。当它进入后台,它所包含的所有的Activity都将Stop,但是Task仍然保持不变,它只是失去了焦点让给了另外一个Task,如图2所示图2:两个Task:Task,A在后台,等待恢复,而Task B在前台接收用户交互。用户可以让一个Task回到前台,假如:Task A有3个Activity在堆栈里面,2个在下面,用户按下Home键,然后启动另外一个应用程序,Task a进入后台,系统为新的应用程序建立一个它自己的堆栈 Task B,用户和Task B 交互后再选择A,此时Task A完好无损,并且恢复到顶部的Activity,此时用户还可以继续选择B,这是android一个多应用的简单的例子。注:多个任务可以在后台,但是如果系统资源不足,则会杀死一些后台Activity,有时可能会造成数据的丢失。因为Activity在Back stack中是不可以被重新排序的,if your application allows users to start a particular activity from more than one activity,新的Activity实例将被创建,并且加入到Stack中(而不是把上一个实例移动到stack的最顶端),因此,在您的应用程序中的一个Activity可能被实例化多次(甚至是从不同的Task),如图3所示 。图3。一个Activity被实例化多次。if the user navigates backward using the BACK key, each instance of the activity is revealed in the order they were opened (each with their own UI state).但是,您可以修改此行为,如果你不想把一个Activity多次实例化。这将是接下来讨论的内容总结默认Task:1、当Activity A 开启Activity B ,A被Stop,但是系统保留了他的状态(如滚动条的位置,输入的文本),如果用户在B按下返回键那么A将被恢复2、当用户通过HOME键离开Task,当前的Activity将被Stop并且Task进入后台,系统会保留这个Task中所有Activity的状态,如果用户通过选择Launche上的ICON恢复了这个Task,这个Task将回到前台并且显示它顶部的那一个Activity。3、如果用户按下Back键,当前的Activity将从Task从移除,并且销毁,下一个Activity将被恢复,被销毁的Activity不会被保存状态。4、Activity可以被多次实例化,甚至在其他的Task中。保存Activity状态:正如上面说的,系统默认保存被Stop的Activity的状态,这样,用户通过Back键将返回到上一个Activity并且是他离开时的界面,However, you can—and should —proactively retain the state of your activities using callback methods, in case the activity is destroyed and must be recreated.当系统资源部足时会杀死一些Activity,所以您可以通过onSaveInstanceState()来保存你的状态。For more information about how to save your activity state, see the Activities document.管理Task:Android的Task 和Back stack管理正如上面所说,所有的Activity在成功启动之后都是“先进后出”的原则,对于大多数的应用程序来说,您不用担心您的Activity在Task和Back stack中是怎么退出和进入的。但是,您可能有特殊的需求需要更改这样的行为。也许您希望您应用程序中的一个Activity在创建的时候进入一个新的Task(不是当前的Task),或者您想使用一个已经存在的实例(而不是创建一个新的实例在back stack的顶部),或者您希望当用户离开您的Task时清楚除了根Activity之外的所有Activity.您可以做这些事情只要您配置Manifest中<activity>标签的属性和您再调用startActivity()时Intent的属性。在Activity的属性中 您主要可以使用
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
在Intent的属性中 您主要可以使用
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP
在接下来的内容中 您将看到如何使用这些,这些和Task和Back stack的关系。注意:大多数的应用程序 不需要更改这些行为。如果您真的需要使用,请您谨慎测试,他可能会发生您预料之外的事情。定义launchModeLaunch modes允许您定义如何创建一个新的Activity在当前的Task中。您可以定义launchMode有两种方式:1、使用manifest:当你声明一个Activity在manifest文件中,您可以指定Activity应如何与Task相关联,当它启动时。2、使用Intent flags:当您调用startActivity()时,您可以通过setFlags()来声明怎么(是否)创建一个Activity在当前的Task中。因此如果Activity A启动 Activity B ,B在manifest中定义了如何在task中创建新的实例,A也可以要求B如何加载,如果这两种都有定义,那么A请求的优先级(在Intent中定义)将高于B所定义的优先级(在manifest中定义)。Note: Some the launch modes available in the manifest are not available as flags for an intent and, likewise, some launch modes available as flags for an intent cannot be defined in the manifest.以下翻译不知道是否正确注:一些launchMode,在manifest中有在Intent中没有,同样在Intent中有的可能在manifet中没有。

使用manifest文件

manifest文件中声明一个Activity时,可以指定Activity应如何与Task相关联 ,通过设置
<activity>
元素的
launchMode
属性。
launchMode
属性指定一个Activity如何被加入到Task中 。有四种不同的Mode,可以
分配
给launchMode属性:"standard" (默认模式)当它开始的时候系统都会为它在Task中创建一个新的实例。Activity可以多次实例化,每个实例都可以属于不同的Task,一个Task可以有多个实例。“singleTop”如果一个Activity已经存在于当前Task的顶部,那么系统将通过onNewInten()调用到该实例,而不是启动一个新的实例,Activity可以多次实例化,每个实例都可以属于不同的Task,一个Task可以有多个实例(但仅限于这个Task的顶部不存在这个Activity才会去创建新的)。例如:假设一个Task的Back stack是 a-b-c-d,a在底部,d在顶部,这时候一个Intent要start d这个Activity,如果d的launchMode是“standard”那么系统将创建一个新的实例,现在的堆栈就变成a-b-c-d-d,但是如果d的launchMode是“singleTop”的,那么已经存在的d会通过onNewIntent来处理这种行为,那么之后的堆栈仍然是a-b-c-d,因为d在这个堆栈的顶部,但是如果一个Intent要启动b,那么系统将会创建一个b的新实例,因为b不在堆栈的顶部。* 注意,当创建一个新的activity实例来处理一个新的行为时,用户总是能够通过按下BACK按键退回到前面的状态(前一个activity)。但是当一个已经存在的activity实例处理一个新的行为时,用户不能通过按下BACK按键退回到前面的状态。 (没有测试具体情况)"singleTask"系统将创建一个新的Task和新的Activity在Task的底部 。但是如果一个Activity已经存在Task中,会调用他的onNewIntent()方法,而不是创建一个新的实例,在一段时间内只能有一个实例存在。注意:虽然是在一个新的Task中开始的,但是用户点击返回键仍然会返回到前一个Activity.“singleInstance” 和singleTask基本上一样,但是singleInstance的Task中不能再加入其他的Activity,这个实例只有一个。另外的一个例子,浏览器的应用程序声明他的浏览网页的Activity始终打开在她自己的Task中(通过设置launchMode=“singleTask”),这意味着,如果你的程序需要打开ANdroid的浏览器,他的Activity和您的应用程序并没有在一个Task中。或者创建一个新的Task或者使用已经存在的实例接受您的意图。不管一个Activity的开始是在一个新的Task还是在同样的Task中,用户点击返回键都会返回到他浏览的上一个Activity。不过,如果你从你的Task(A)启动了一个launchMode=“singleTask”的Activity的话,也许这个Activity已经有一个实例在后台并且有它自己的Task(B),在这种情况下,如果Task B要接收一个新的Intent的话,BACK键会首先TaskB 中的Activity直到返回到Task A的最顶端。使用Intent flags有以下flags:FLAG_ACTIVITY_NEW_TASK创建一个新的Task为这个Activity ,他将产生和“singleTask”一样的行为。FLAG_ACTIVITY_SINGLE_TOP这将产生相同的行为
“singleTop”
FLAG_ACTIVITY_CLEAR_TOP如果启动的Activity已经运行在当前的Task中,那么他将销毁他上面所有的Activity而不是去创建一个新的Activity。以下内容转载自:http://lydia-ylh.iteye.com/blog/1100050    * 哪个任务存放着activity,用来对行为进行响应。对“standard”和“singleTop”模式来说,这个任务是产生行为(并且调用 startActivity())的那个——除非行为对象包含了 FLAG_ACTIVITY_NEW_TASK标记。在这种情况下,像前面那节Affinities and new tasks 描述的一样,将会选择一个不同的任务。* 它们是否可以有多个实例。”standard”和“singleTop”类型的activity可以被实例化多次。它们可以属于多个任务,一个特定的任务也可以拥有同一个activity的多个实例。* 作为比较”singleTask”和”singleInstance”类型的activity只限定有一个实例。因为这些activity是任务的根。这个限制意味着,在设备上不能同时有超过一个任务的实例。* 是否能有其他的activity在它所在的任务中。”singleInstance”类型的activity是它所在任务中唯一的 activity。如果它启动了其他的activity,不管那个activity的启动模式如何,它都会加载到一个不同的任务中——好像行为对象中的 FLAG_ACTIVITY_NEW_TASK标记。在其他的方面,”singleInstance”和”singleTask”模式是相同的。* 其他三种模式运行任务中有多个activity。”singleTask”总是任务中的根activity,但是它可以启动其他的activity并分配到它所在的任务中。”standard”和”singleTop”类型的activity可以出现在任务中的任何地方。* 是否启动一个新的实例来处理一个新的行为。对默认的”standard”模式来说,对于每一个行为都会创建一个新的实例来响应。每个实例只处理一个行为。对于”singleTop”模式,如果一个已经存在的实例位于目标任务activity栈的栈顶,那么他将被重用来处理这个行为。如果它不在栈顶,它将不会被重用,而是为行为创建一个新的实例,并压入栈中。* 例如,假设,一个任务的activity栈由根activity A和 B,C,D从上到下按这样的顺序组成,所以这个栈就是A-B-C-D。一个行为指向类型为D的activity。如果D是默认的”standard”加载模式,一个新的实例会被启动,栈现在就是这样A-B-C-D-D。但是,如果D的加载模式是”singleTop”,已经存在的实例会用来处理这个行为 (因为它在栈的顶端)并且栈中还应该是A-B-C-D。* 在前面提到,”singleTask”和”singleInstance”类型的activity最多只有一个实例,所以他们的实例应该会处理每个新的行为。”singleInstance”类型的activity总是在栈的顶端(因为他是任务中唯一的一个activity),所以总是能够适当的处理行为。然而,”singleTask”类型的activity也许会有其他的activity在它的上面。如果是这样的话,那就不能处理这个行为,这个行为被丢弃。(即使这个行为被丢弃了,它的到来也会导致那些应该保留不变任务显示到前台来)。* 当一个activity被要求处理一个新的行为时,行为对象会通过调用activity的 onNewIntent() 方法传递进来(最初启动activity的行为可以通过调用getIntent()方法获得)。* 注意,当创建一个新的activity实例来处理一个新的行为时,用户总是能够通过按下BACK按键退回到前面的状态(前一个activity)。但是当一个已经存在的activity实例处理一个新的行为时,用户不能通过按下BACK按键退回到前面的状态。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: