Android API Guides---Tasks and Back Stack

一个应用程序通常包括多个活动。每一个活动应环绕行动的用户能够运行,而且能够启动其它活动的特定种类进行设计。比如,电子邮件应用程序可能具有一个活动,以显示新的消息的列表。当用户选择一个信息。一个新的活动打开,以查看该消息。


的活性甚至能够就存在于设备上的其它应用程序的活动。比如,假设你的应用程序想要发送电子邮件时,您能够定义运行“发送”採取行动的意图。包含一些数据,如电子邮件地址和消息。

从声明本身来处理这样的意图的其它应用程序的活动,然后打开。

在这样的情况下,目的是发送电子邮件,所以电子邮件应用程序“撰写”活动启动(假设有多个活动支持同样的意图,然后系统让用户选择使用哪一个)。

当发送的电子邮件,你的活动,并恢复它好像电子邮件活动是应用程序的一部分。尽管活动可能来自不同的应用程序。Android的维护通过保持在同样的任务活动都这样的无缝的用户体验。


任务是用户运行某些任务时,互动活动的集合。活动都布置成堆叠(背面叠层),在当中。每一个活动被打开的顺序。
该设备主屏幕是大多数任务的起始位置。当用户触摸应用程序启动器的图标(或主屏幕上​​的快捷方式),该应用程序的任务来到前台。假设没有任务存在该应用程序(该应用程序尚未近期使用)。则新的任务。创建与该应用程序的“主”活动打开,如在堆栈中的根活动。

当电流活动開始还有一个新的活动推到堆栈的顶部和获得焦点。在先前的活动保持在栈,但已停止。当一个活动停止时,系统保持其用户接口的当前状态。

当用户按下返回button,当前的活动,从堆栈的顶部弹出(活性被破坏)和前一活动恢复(其UI的先前状态被恢复)。

在堆栈中的活动永远不会又一次排列,仅仅推和弹出堆栈推时。由当前的活动開始。当用户离开它使用后退button弹出到堆栈中。因此,回堆栈操作为“后进先出”的对象结构。

图1可视化与示出具有在每一个时间点的电流背面叠层沿活动之间的进度时间表此行为。


图1.在任务每个新的活动是怎样添加一个项目后面堆栈的表示。当用户按下后退button,当前的活动被破坏,曾经的活动恢复。

假设用户继续按下后退,则在栈每一个活动被弹出以显示前一个,直到用户返回到主屏幕(或取其活性执行时,任务開始)。当全部的活动都从堆栈​​中移除。任务不再存在。


图2.两个任务:任务B接收在前台用户交互,而任务A是在后台,等待被恢复。


图3.单一活动多次实例化。
任务是能够移动的“后台”。当用户開始一个新的任务或进入主屏幕。通过Home键一个有凝聚力的单位。

而在后台,在任务中的全部活动都停止了,但该任务的堆栈背面保持不变,任务已经根本失去焦点。而还有一个任务发生。如图2。

然后一个任务能够返回“前台“,使用户能够拿起他们离开。如果,比如。当前的任务(任务A)具有在其堆栈个当前活动在三个活动。

用户按下Home键,然后開始从应用程序启动一个新的应用程序。当出如今主屏幕上,任务A进入后台。当新的应用程序启动时,在系统启动该应用程序(任务B)和其自身的活动堆栈的任务。与该应用程序交互之后。用户再次返回家而且选择最初启动任务A.如今。应用程序,任务A来在其堆栈中的前景,全部三个活动完整并于堆栈恢复的顶部的活性。在这一点上,用户还能够回家和选择開始该任务的应用程序图标(或从总览画面中选择应用程序的任务)切换到任务B。

这是多任务Android上的一个样例。


注:多重任务能够在后台同一时候举行。然而。假设用户在同一时间执行多个后台任务,系统可能会開始,以便破坏后台活动来恢复存储器,导致丢失的活动状态。请參阅有关的活动状态下节。
由于在后面堆栈中的活动永远不会又一次排列。假设你的应用程序同意用户从多个活动启动一个特别的活动,是创建活动的新实例,并压入堆栈(而不是使活动的不论什么一个实例顶端)。这样,在应用程序中一个活动可能被多次实例化(即使从不同的任务),如图3这样。假设用户使用Backbutton导航向后,活动的每个实例揭示的顺序被打开(每个都有自己的UI状态)。可是。您能够改动此行为,假设你不希望一个活动被实例化不止一次做。怎样做到这一点在大约管理任务后面的章节中讨论。
总结各种活动和任务的默认行为:
当活动A開始活动B,活动A被停止,但系统保持其状态(如滚动位置并输入到表单文本)。假设用户按下返回键,而在活动B。活动A恢复其状态的恢复。
当用户通过按压主页button离开的任务。当前活动停止。它的任务进入后台。系统保留在任务的每一次活动的状态。假设用户稍后通过选择開始该任务的启动器图标恢复的任务,任务涉及到前景和在堆栈的顶部恢复活性。


假设用户按下后退button,当前的活动是从堆栈中弹出并销毁。在堆栈上一个活动又一次開始。当一个活动被破坏,系统不会保留该活动的状态。


活动能够被实例化多次,即使从其它任务。


导航设计
欲了解很多其它有关应用程序的导航是怎样工作的,在Android上阅读Android设计的导航指南。
节能活动状态
如上所讨论的,当它被停止系统的默认行为保留的活性的状态。这样。当用户导航回到曾经的活动。它的用户界面出如今他们离开的方式。可是。您能够和应该-主动保留使用回调方法你的活动状态,以防活动被破坏。必须又一次创建。
当系统停止的活动之中的一个(当一个新的活动開始或任务移动到背景,如),系统可能是否须要恢复系统内存全然破坏该活性。发生这样的情况时,关于该活动状态的信息丢失。

假设发生这样的情况,则系统仍然知道该活动在背面叠层一个地方,可是,当活动被带到堆栈的顶部。系统必须又一次创建(而不是恢复它)。为了避免丢失用户的工作,你应该主动通过实现您的活动的onSaveInstanceState的()回调方法保留。
有关怎样保存你的活动状态的很多其它信息,请參见活动文档。


管理任务
在Android的方式管理为同样的任务,并在上面所描写叙述将全部活动正式開始纷纷“后进先出”的任务。并返回堆叠,堆叠的伟大project。对于大多数应用程序,你不应该操心关于你的活动是怎样与任务或怎样相关,他们在后面堆栈存在。

然而。你可能会决定要中断正常的行为。或许你想在你的应用的活动启动时(而不是放在当前的任务范围内)。開始一个新的任务;或者,当你開始一个活动。你要提出它的一个现有实例(而不是在后面堆栈的顶部创建一个新的实例);或者,你希望你的背部栈的全部活动。除了当用户离开任务根系活力被清除。
你能够做这些事情多了。用在<活动>清单元素。并与意图标志的属性,你传递给startActivity()。
在这方面,基本的<活动>属性,你能够使用例如以下:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
您还能够使用的主要意图标志是:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP
在以下的章节中,您将看到怎样使用这些清单属性和意图的标志来定义的活动是怎样与任务,以及他们怎样在后面堆栈的行为有关。


此外,单独讨论是任务和活动费怎样能够表示和总览画面中管理的考虑。參见概述屏幕以获取很多其它信息。

通常情况下。你应该让系统定义怎样你的任务和活动总览画面中的代表,而你不须要改动此行为。
注意:大多数应用程序不应中断活动和任务的默认行为。假设确定有必要为您的活动来改动默认行为,慎重使用并确保发射期间,測试活动的可用性以及其它活动和任务的后退button导航回到它的时候。

一定要測试。可能与用户的预期行为相冲突的行为导航。


定义启动模式
启动模式同意您定义一个活动的新实例与当前任务相关联。您能够通过两种方式定义不同的启动模式:
使用清单文件
当您在清单文件里声明的活动。您能够指定活动应当与任务启动时关联。


使用意向的标志
当你调用startActivity(),您能够包含在Intent一个标志,宣告新的活动应该怎样或者是否与当前任务相关联。
因此,假设活动A開始活动B,活动B能够在其清单定义应该怎样与当前任务相关联(假设有的话)和活动A还能够要求活动B应该怎样与当前任务相关联。假设这两个活动定义活动B应该怎样与任务关联起来,那么活动A的请求(如意图定义)非常荣幸在活动B的请求(在其清单中定义)。


注:可用于清单文件的一些启动模式不能作为标志的意图。相同。对于一个意图能够作为标志的一些启动模式不能在清单中定义。


使用清单文件
当声明清单档案中的一个活动,您能够指定活动应怎样使用<活动>元素的launchMode属性的任务关联。
该launchMode属性指定的活动应该怎样启动到任务的指令。有四个能够分配到launchMode属性不同的启动模式:
"standard"(默认方式)
默认。系统创建从它被启动,而且路由意图它在任务的活动的新实例。该活动能够被实例化多次,每一个实例能够属于不同的任务,一个任务能够具有多个实例。
“singleTop”
假设活动的一个实​​例已存在于当前任务的顶部。系统路由通过其onNewIntent()方法的调用,而不是创建活动的新实例的意图,该实例。该活动能够被实例化多次,每一个实例能够属于不同的任务。和一个任务能够有多个实例(但仅仅有当在后面堆栈的顶部的活性是不活动的现有实例)。
比如,假定任务的回堆栈由与活动B,C和D在上面根系活力A的(堆栈A-B-C-D,D为顶部)。意向到达类型D的活性。假设D有默认的“标准”的推出模式,类推出的一个新实例。且堆栈成为A-B-C-D-D。

然而,假设D的发​​射模式是“singleTop”,D的现有实例接收通过onNewIntent()的意图。由于它是在堆叠的堆叠的顶部保持的A-B-C-D。

可是,假设意图到达用于B型的活性,则B的一个新实例被加入到堆栈中。即使它的发射模式是“singleTop”。


注意:当创建活动的新情况下。用户能够按后退button返回到曾经的活动。

可是。当一个活动的现有实例处理新的意图,用户不能按后退button返回到活动状态的新意图。onNewIntent到来之前()。
“singleTask”
系统将创建一个新的任务和新任务的根实例化的活动。

然而,假设活动的实例中已存在一个单独的任务,该系统路由通过其onNewIntent()方法的调用,而不是创建一个新的实例意图的现有实例。仅在活动中的一个实例能够在一个时间存在。
注意:尽管活动在一个新的任务開始。后退button仍然使用户返回到先前的活动。


“singleInstance”。


同为“singleTask”,所不同的是,系统不发射不论什么其它的活动进保持该实例的任务。

活动始终是它的任务单,唯一的成员;不论什么活动,通过这一个在一个单独的任务开放開始。
还有一个样例是,Android浏览器应用程序声明的Web浏览器的活动要常常在自己的任务,通过指定<活动>元素singleTask启动模式打开。

这意味着。假设你的应用程序发出的意图打开Android浏览器,它的活动不放在同一个任务,您的应用程序。相反,不管是新的任务 - 为浏览器启动时,或者,假设浏览器已经在后台执行一个任务,该任务被提出来处理新的意图。

无论活动是否在一个新的任务或在同一任务。启动它的活动開始,后退button始终把用户曾经的活动。可是,假设你開始指定singleTask启动模式的活动,则该活动的一个实​​例,在后台任务存在,那整个任务带到前台。在这一点上。回栈如今包含从任务的全部活动提出,在堆栈的顶部。图4显示了这样的类型的场景。


图4与发射模式“singleTask”的活性怎样被加入到回栈的表示。假设活动是已与它自己的背面叠层后台任务的一部分。则整个背面叠层还附带向前,在当前任务的顶部。


有关在manifest文件里使用发射模式的具体信息,请參阅<活动>元素的文档,当中launchMode属性和接受的价值进行了讨论很多其它。
注意:您指定的launchMode属性的活动的行为,能够通过包含与启动活动的意图标志覆盖,如在下一节讨论。
使用意向的标志
当启动一个活动。你能够通过在意图的标志,你传递给startActivity()改动活动。其任务的默认关联。你能够用它来改动默认行为的标志是:
FLAG_ACTIVITY_NEW_TASK
在開始新任务的活动。

假设任务已经为你如今也開始活动执行状态,确保任务带到前台,其最后的状态恢复,并在活动中收到的onNewIntent新意图()。
这会产生同样的行为“singleTask”launchMode值,前一节中讨论。
FLAG_ACTIVITY_SINGLE_TOP
假设被启动的活性是当前活动(在后面堆栈的顶部),则现有的实例接收而不是创建活动的新实例)调用onNewIntent(,。
这产生同样的行为为“singleTop”launchMode值,前一节中讨论。
FLAG_ACTIVITY_CLEAR_TOP
假设正在启动的活动在眼下的任务已经在执行,那么取代开展这一活动的新实例,都在它之上的其它活动中被破坏,这个意图传递到恢复活动的实例(今顶),通过onNewIntent())。


没有为产生这样的行为的launchMode属性没有价值。
FLAG_ACTIVITY_CLEAR_TOP最常与FLAG_ACTIVITY_NEW_TASK一起使用。当一起使用时。这些标志是定位在还有一个任务现有活动,并把它在一个位置,它能够给意向响应的一种方式。
注意:假设指定的活动的启动模式为“标准”,它也是从堆栈中移除一个新的实例在其位来处理传入的意图启动。

这是由于一个新的实例为何时推出模式为“标准”的新意图始终创建。
处理亲和力
亲和指示活动更喜欢哪个任务属于。

默认情况下,都来自同一个应用程序的活动,对彼此的亲和力。这样,默认,在同一应用程序的全部活动倾向于在同样的任务。可是,您能够改动活动的默认亲和力。在同样的应用程序定义不同的应用中定义能够共享具有亲和性的活动,或活动能够被分配不同的任务的亲和力。
您能够改动亲和力与<活动>元素的属性taskAffinity不论什么给定的活动。
该taskAffinity属性须要一个字符串值,它必须从<清单>元素中声明默认的包名唯一的,由于该系统将使用该名称来标识应用程序的默认任务亲和力。
亲和进场在两种情况下:
当启动一个活动意图包括FLAG_ACTIVITY_NEW_TASK标志。


一个新的活动,在默认情况下,射入调用startActivity()活动的任务。

它推到同样的回栈调用者。

可是,假设传递给startActivity()的意图包括FLAG_ACTIVITY_NEW_TASK标志,系统会寻找不同的任务。以容纳新的活动。通常情况下,这是一个新的课题。

然而,这并不必须如此。

假设已经有一个与作为新的活动同样的亲和力现有任务,活动发射到该任务。假设不是,它開始一个新的任务。
假设这个标志导致活动開始一个新的任务。用户按下Home键离开它,必须有某种方式为用户导航回任务。一些实体(如通知管理器)总是一个外部任务開始的活动。从来没有像自己的一部分。所以他们总是把FLAG_ACTIVITY_NEW_TASK在他们通过给startActivity的意图()。假设你有一个能够通过可能使用此标志的外部实体调用的活动,採取用户有独立的方式回到那个年代開始,如用发射器图标(任务的根系活力的任务护理有CATEGORY_LAUNCHER意图过滤器;请參阅以下的启动任务部分)。
当一个活动都有其allowTaskReparenting属性设置为“真”。
在这样的情况下,活动能够从它開始它具有亲和性的任务的任务移动。当该任务涉及到前台。
比如,如果该报告的天气条件中选择的城市的活性被定义为一个旅游应用程序的一部分。它具有如在同一应用程序的其它活动同样的亲和力(默认的应用程序亲和力)。它同意又一次养育具有此属性。当你的活动中的一个開始,天气报告基因活性。它最初属于同样的任务中的活动。然而。当旅行应用程序的任务涉及到前台。天气报告活性被又一次分配到该任务,并在其内显示。
提示:假设一个.apk文件包括但从用户的角度不止一个“应用程序”,你可能想使用taskAffinity属性分配不同的亲和力与每个“应用程序”相关的活动。
清除栈回
假设用户离开了非常长时间的任务。系统清除除了根活性的全部活动的任务。

当用户再次返回到任务。仅仅有根活性恢复。

该系统的行为这样的方式,由于,延长的时间量之后,用户可能已经放弃了他们之前被做的和正在返回的任务,開始新的东西。


有一些活动属性,你能够用它来改动此行为:
alwaysRetainTaskState
假设这个属性在任​​务的根系活力设置为“true”,刚刚描写叙述的默认行为不会发生。

该任务即使经过长时间保留在堆栈中的全部活动。
clearTaskOnLaunch
假设这个属性在任​​务的根系活力设置为“真”。堆栈被清除下来。每当用户离开任务并返回到它的根系活力。

换句话说,它是alwaysRetainTaskState相反。用户总是返回到它的初始状态的任务时。离去的任务仅仅有一个的时刻,即使之后。
finishOnTaskLaunch
该属性是像clearTaskOnLaunch。但它执行在一个单一的活动,而不是一个完整的任务。它还可能导致的不论什么活动走开,包含根系活力。当它被设置为“真”,该活动仍然仅仅对当前会话的任务的一部分。

假设用户离开,然后返回到该任务,这是不再存在。
启动任务
您能够通过给它一个意图过滤器一个带有“android.intent.action.MAIN”为指定的操作和“android.intent.category.LAUNCHER”为指定的类别设置一个活动为切入点的任务。

比如:
<

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

这种一个意图过滤器会导致要显示在应用程序启动的活动。给用户的方式来开展活动。并返回到它创建它已经启动之后的不论什么时间任务的图标和标签。


这第二个能力是非常重要的:用户必须可以留下一个任务。然后回来以后再使用这个活动发射器。出于这个原因,该标活动总是启动一个任务,“singleTask”和“singleInstance”两个发射模式,应该使用仅仅有当活动具有ACTION_MAIN和CATEGORY_LAUNCHER滤波器。想象一下。比如,假设过滤器丢失会发生什么:一个意图启动一个“singleTask”活动。启动了新的任务,用户花费一些时间完毕这项任务的工作。然后。用户按下Home键。任务如今发送给背景和不可见。

如今。用户没有办法返回任务,由于它不是在应用程序启动来表示。


对于那些情况下,你不希望用户可以回到一个活动。设置<活动>元素的finishOnTaskLaunch为“true”(请參阅​​清除栈)。
关于任务和活动费怎样表示和管理概览屏幕方面进一步的资料概述屏幕可用。

原文地址:https://www.cnblogs.com/brucemengbm/p/7306373.html