Android帮助文档翻译——开发指南(三)任务和Back Stack

来源:互联网 发布:js函数有返回值吗 编辑:程序博客网 时间:2024/05/21 01:28

一个应用程序通常都包含了多个activity。每一个activity都应该回避设计成(designe around)能执行用户特定动作以及启动其它activity。例如,一个邮件应用程序需要有一个用来显示新邮件列表的activity,当用户选中了其中一个邮件时,将打开另一个新的activit浏览邮件内容。

一个activity甚至能打开设备上其它应用程序中的activity。比如,如果你的应用程序需要发送一个电子邮件,你就应该定义一个执行“send”动作并包含了邮箱地址、邮件内容等数据的意图(intent)。其它应用程序中声明处理这种意图的activity将会被打开。这种情况下,因为我们的这个意图是要去发送一个邮件,所以一个邮件应用程序的写邮件activity将会打开(如果有多个activity能处理这种意图,那么系统会让用户选择要哪一个去执行)。当邮件发送完毕后,你的activity将恢复出来,这样让那个邮件程序看起来像是你的应用程序的一部分。虽然多个activity可能是来自不同的应用程序,但是Android系统通过把这些activity放在同一个任务中,使得用户有无缝的体验。

一个任务就是用户执行某个特定工作过程中相互影响的activity的集合。这些activity按照打开的顺序放在一个栈中(back stack)。

设备的主界面是大多数任务的起点。当用户触摸了程序列表的一个图标或主界面的一个快捷方式时,一个应用程序任务将置于前台。如果没有与这个程序对应的任务时(由于这个程序最近没有使用),系统将创建一个新的任务,并把这个程序的“main activity作为栈的根activity

当当前activity启动其它activity时,一个新的activity将被压到栈顶并获取到焦点。先前的activity虽然保留在栈中,但已经被停止了。当一个activity停止时,系统会保存它的用户接口界面的当前状态。这样当用户按返回键时,当前activity将多栈顶弹出(即这个activity被销毁),而之前的activity将被恢复(UI之前的状态被恢复出来)。栈中的所有activity永远不会被重新组合排列,只有压栈和出栈两个动作,即当activity被启动则压入栈中,当用户按下返回键离开activity时从栈中弹出。正如上面所讲,这个back stack是一个遵循后进先出原则的对象结构。图1呈现了一个带时间轴的activity演变图,并给出了每次操作时back stack的状态。

 

1 演示了每一个activity如何增加一个条目到back stack中去。当用户按了返回键时,当前activity被销毁,先前的activity恢复。


如果用户连续按返回键时,栈中每一个activity将被弹出来以显示前一个activity,一直到用户返回到主界面或任务开始时正在运行的那个activity。当栈中的所有activity被弹出后,这个任务也将不复存在。

2 两个任务:任务A在后台等待被恢复,而任务B在前台接收用户的交互信息


任务是一个当用户开户新的任务或回到主界面(通过按HOME键)时能够被移到后台的聚合单元。当任务在后台时,它里面的所有activity将被停止,但任务的back stack被完整地保存在内存中,即当有其它任务启动时,当前任务仅仅是失去了焦点而已,如图2所示。因为一个任务能够返回到前台,所以用户可以在它被停止的断点重新启动。举个例子,假如当前任务(称为“任务A”)在栈中有三个activity,其中两个在当前activity的下面。用户可以按下HOME键回到主界面并从程序列表中启动一个新的程序。当主界面出现时,任务A被置于后台。当打开一个新的应用程序时,系统将为这个新的程序启动一个带有它自己activity栈的任务(称为“任务B”)。经过一些操作后,用户又返回到主界面并选中之前的程序,这样就重新启动了任务A。这时任务A又回到了前台,即其栈中的三个activity是完整的,并且栈顶的activity会被恢复出来。此时,用户也可以通过返回到主界面再选中程序图标启动程序回到任务B中。这就是Android系统多任务的一个例子。

注:多个任务能同时运行在后台。如果用户在同一时间运行了很多个后台任务,系统可能为了回收内存而销毁后台的activity,这就导致了activity的状态会丢失。可以参考下面关于activity状态的章节。

 

待续……

原创粉丝点击