现在的位置: 首页 > 综合 > 正文

安卓翻译 Tasks and Back Stack (一)

2018年09月24日 ⁄ 综合 ⁄ 共 3871字 ⁄ 字号 评论关闭

Tasks and Back Stack

一个应用通常包含多个activities。每个activity都应该围绕这一个特别的用户能够执行并且能启动其它activities的行为来设计。例如,一个邮件应用可能有一个展示一列新邮件的activity。当用户选择一封邮件时,一个新的activity打开来观看这封邮件。


一个activity甚至能启动设备上存在于其他应用中的activities。例如,如果你的应用想要发送一封邮件,你能定义一个intent来执行“send”行为并且包含一些数据,例如邮件地址和一个信息。来自其他应用中的activity声明它自己处理这种类型的intent然后打开。在这种情况下,intent将要发送一封邮件,因此一个邮件应用的“构件”activity会启动(如果多个activities支持同样的intent,那么系统会让用户来选择使用哪一个)。当邮件被发送时,你的activity会重现并且它看起来好像邮件activity是你应用中的一部分。虽然activities可能来自不同的应用,安卓通过保持在同一个任务中来保持activities来保持这种紧密的用户体验。


一个任务是一个当执行一个特定任务时,用户与之相交互的activities的集合。activities被安排在一个栈中(返回栈),使每个activity顺序被打开。

设备的主屏是大多数任务开始的地儿。当用户在应用launcher中点击一个图标时(或在主屏上的一个快捷方式)时,那个应用的任务就将会来到前台。如果这个应用没有任务存在(这个应用进来没被使用过),那么一个新的任务会被创建并且对那个应用的主activity会作为在栈中的一个跟activity被打开。


当前的activity启动另外一个时,新的activity被压入栈顶并且获得焦点。之前的activity保存在栈中,但是被停止。当一个activity停止时,系统保存它当前的用户界面状态。当用户点击返回按钮时,当前的activity从栈顶出栈(activity被摧毁)并且之前的activity呈现(这个activity之前的UI状态也被恢复)。在栈中的activities从来都不会被重新排列,仅从栈中入栈和出栈--当被当前的activity启动时,新activity会被入栈,当用户使用返回按钮离开当前activity时,它会被出栈。同样地,返回栈以“最后进,最先出的”对象结构来运行。图一用一个时间线将这种行为可视化,来展示在每个时间点内的返回栈中的activity之间的进程。


图一。在一个任务中每个新的activity怎样增加一个item到返回栈中的展现。当用户点击返回按钮时,当前的activity被摧毁并且前一个activity重现。

如果用户继续点击返回按钮,那么在栈中的每个activity都会被出栈露出之前的那个,知道用户返回到主屏(或者任何一个当任务开始时正在运行的activity)。当所有的activities被从栈中移除时,任务就不再存在。

一个任务是当用户开始一个新任务或者通过 Home键返回主屏幕时能够以一个整体单元返回后台。当在后台时,在任务中的所有activities都被停止,但是任务的返回栈仍然保持完整--任务仅仅在当另外一个发生时丢失焦点,如在图2中展示的那样。一个任务能够返回前台,这样用户就能选择他们离开的地方了。例如,假设当前任务在它的栈中有三个activities--两个在当前activity的下面。用户按下Home键,然后从应用的launcher中启动一个新应用。当主屏出现时,任务A返回到后台,当新应用启动时,系统为应用B和它自己activities栈启动一个任务。在和那个应用交互后,用户又返回到主页并且选择初始时启动的任务A应用。现在,任务A来到前台--在它的栈中的所有三个activities是完整的并且在栈顶的activity会重新开始。在这点,用户也能通过回到主页并且选择启动那个任务的应用图标来转回到任务B(或者通过从最贱的apps页面中选择那个app的任务)。



注意:多个任务能立刻被保持在后台。然而,如果用户在同一时间正在运行许多后台任务,系统可能销毁后台activities为了恢复内存,这会引起activity状态的丢失。看下面关于Activity state的章节。


应为在返回栈中的activities从来都不会被重新排序,如果你的应用允许用户从超过一个activity中来启动一个特定的activity,那么那个activity的一个新的实例会被创建并且被推入栈顶(而不是将activity前一个实例带到栈顶)。如此这般,你应用中的一个activity可能会被实例会多次(甚至从不同的任务中),像在图3中展示的一样。这样的话,如果用户用返回键导航回去,activity的每个实例都会被呈现以使他们打开(每个都有自己的UI状态)。然而,如果你不想让一个activity被实例化多次你能调整这个行为。在后面关于管理任务的章节中会讨论怎么做。


为activities和任务概括默认行为:

当Activity A 启动了Activity B,Activity A就会被停止,但是系统会保存它的状态(例如,滚动位置和输入进表格的文字)。如果当用户在Activity B中点击返回键时,Activity A会和它的被保存的状态一起重新显示。


当用户通过Home键离开一个任务时,当前的activity会被停止而且它的任务也会进入后台。系统在任务中保存每个activity的状态。如果用户稍后通过选择launcher图标开始那个任务来使它重新显示,那么这个任务就来到前台并且重新显示栈顶的activity。

如果用户点击返回键,那么当前的activity会被出栈并被销毁。在栈中的前一个activity就被重新显示。当一个activity被销毁时,系统不保存activity的状态。

Activities能被实例化多次,即使从其它的任务中。

导航设计

关于更多的app怎么在安卓上导航,读Android 设计的导航引导。


保存Activity状态

像在上面中讨论的那样,系统默认行为会保存当activity被停止时之前的状态。这样的话,当用户导航返回到之前的activity,它的用户界面会像它们离开前那样的显示。然而,你能-并且应该-主动地使用回调方法来保存你的activities的状态,以防activity被销毁并且被重新创建。


当系统停止你activities中的一个时(例如,当一个新的activity启动时或者任务移到后台)

,系统可能在它需要恢复系统内存时完全销毁一个activity。当这种情况发生时,关于activity的信息就丢失了。如果这发生了,系统仍然认为那个activity在返回栈中的一个地方,但是activity被带回栈顶时系统就必须重新创建它(而不是重新显示它)。为了避免丢失用户的工作,你应该主动地在你的activity中通过实现onSaveInstanceState()回调方法来保存它。


关于更多如何保存activity状态,看Activities文档。


管理任务

----------------------------------------------------------------------------------------------------------------------------------------------------------

像上面描述的那样。安卓管理任务和返回栈的方式---通过将所有被启动的activities连续放在同一个任务中和后进先出的栈中--这对大多数应用来说都是工作良好的,你不需要担心你的activities怎么和任务联系到一起活着它们怎么生存在返回栈中。然而,你可能决定你想要打断正常的行为。也许你想让你应用中的一个activity在被启动时开始一个新的任务(代替被放在当前的任务中);或者,当你启动一个activity时,你想要得到的是它之前已经存在的一个实例(代替在返回栈中创建一个新的实例);或者,你想让你的返回栈清空所有的activities除了根activity当用户离开任务的时候。


其实你能做更多事情,使用在<activity>manifest标签中的属性和在你传递给startActivity()的intent中的标志就可以。


在这个章节中,你可以使用的重要的<activity>属性有:

taskAffinity

launchMode

allTaskReparentint

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch


你能使用的主要标志有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_SINGLE_TOP

在下面章节中,你将会看到你怎样使用这些属性和标签来定义activities怎样会任务联系在一起并且他梦在返回栈中怎么表现。


注意:大部分应用不应该大段对activities和任务的默认行为。如果你决意认为对你的activity调整默认行为是必须的,那么谨慎的使用并且一定在启动的过程中和当从其它的activities和任务中用返回键返回到它时测试activity的

可用性。一定要测试导航的行为,这个行为可能与用户预期的行为产生冲突。





抱歉!评论已关闭.