Android 任务和回退堆栈---概要介绍

长平狐 发布于 2012/10/16 10:23
阅读 643
收藏 0
一个应用程序通常包含了多个Activity,每个Activity都应该围绕一个用户能够执行的特定动作类型来进行设计,并且能够启动其他的Activity。例如,一个电子邮件的应用程序可能有一个用于显示新邮件列表的Activity。当用户选择一个电子邮件时,就会有一个用于打开电子邮件的新的Activity。

一个Activity甚至能够启动设备上其他应用程序中存在的Activity。例如,如果你的应用程序想要发送一个电子邮件,你能够定义一个执行“发送”动作的Intent,并且可以包含某些数据,如电子邮件地址和邮件内容。然后打开这个来自另一个应用程序的声明了处理这种Intent类型的Activity。在这种场景中,Intent是要发送一封电子邮件,因此一个电子邮件应用程序“撰写”Activity就启动了(如果有多个Activity支持同一个Intent,那么系统会让用户选择其中之一来使用)。当电子邮件被发送后,你的Activity就恢复了,并且这个电子邮件的Activity就像是你的应用程序的一部分。即使这些Activity来自不同的应用程序,Android也能把这些Activity保持在同一个任务中,从而给用户维持这样无缝的用户体验。

一个任务(task)就是一个在执行某项工作时与用户进行交互的Activity的集合。这些Activity按照被打开的顺序依次被安排在一个堆栈中(回退堆栈)。

设备的主屏是大多数任务的启动位置,当用户触摸一个应用程序启动器中图标(或者触摸主屏上的一个快捷图标),应用程序的任务就会在前台显示。如果相关应用程序的任务不存在(最近没有使用对应的应用程序),那么就会有一个新的任务被创建,并且应用程序打开的“主”Activity会作为任务中的根Activity。

在当前的Activity启动了另一个Activity时,这个新的Activity被放到了堆栈的顶部,并且带有焦点。前一个Activity依然保持在堆栈中,但是它出终止状态。当一个Activity终止的时候,系统会保留用户界面的当前状态。当用户按下回退按钮时,当前的Activity从堆栈的顶部弹出(这个Activity被销毁),并且前一个Activity恢复(之前UI被保存的状态)。堆栈中的Activity不会被重新排列,它只是被压入和弹出堆栈---被当前Activity启动时压入到堆栈的顶部,在使用回退按钮离开时从堆栈中弹出。因此,回退堆栈的操作跟后进先出的对象结构是一样的。图1用一个时间表显示了当前回退堆栈中的Activity之间在每个时间点的处理过程

pic

图1. 显示了如何把任务中的每个新的Activity添加到回退堆栈中。在用户按下回退按钮时,当前Activity被销毁,并且前一个Activity被恢复。

如果用户继续按回退按钮,那么堆栈中的每个Activity会被依次弹出,前一个Activity会被显示,直到用户返回主屏(或者返回到任务开始时运行的那个Activity)。当所有的Activity从堆栈中被删除时,这个任务就不再存在了。

一个任务是在用户开始一个新任务或通过主页(Home)按钮返回主屏时,能够转移到后台的一个内聚单元。在后台的时候,任务中的所有Activity都是被终止的,但是针对这个任务的回退堆栈则完整的保留着---这个任务只是在另一个任务发生时失去焦点,如图2中所示,

pic

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

一个任务能够返回到前台,以便用户能够取回他们离开时的状态。例如,假设当前任务A在它的堆栈中有三个Activity---有两个在当前Activity之下。用户按下主页(Home)按钮,然后从应用程序启动器中启动一个的新的应用。当这个新的应用在主屏中显示时,任务A就会被转移到后台。在新的应用启动时,系统会给这个应用启动一个带有自己的Activity堆栈的任务B。跟这个任务B的应用交互后,用户再次返回到主页(Home),并且选择了最初启动任务A的应用。现在,任务A会返回到前台---它的堆栈中所有的三个Activity是完整的,并且在堆栈顶部的Activity被恢复。在这个时点,用户也能够通过主页按钮和选择启动任务B的应用的图标返回到任务B(或者通过触屏和控制主页按钮来显示最近的任务,并选择其中之一)。这就是基于Android的多任务的例子。

注意:后台中可以同时拥有多个任务,但是如果用户同时运行了很多后台任务,系统为了回收内存可能开始销毁一些后台的Activity,从而导致Activity的状态丢失。

因为回退堆栈中的Activity不曾被重新排列,因此如果允许用户从多个Activity中启动一个特殊的Activity,那么就会创建一个新的Activity实例,并且在堆栈的顶部弹出(而不是把之前的Activity实例带到堆栈的顶端)。这样在你的应用程序中一个Activity就可能被实例化多次(甚至来自不同任务),如图3所示。

pic

图3. 一个Activity被实例化多次

这样,如果用户使用回退按钮向后导航,那么Activity的每个实例就按照被打开顺序依次显示(每一个都带有自己的UI状态)。但是如果你不想让一个Activity被实例化多次,你可以编辑这个行为,如何编辑会在稍后的管理任务(Managing Tasks)一节中讨论。

Activity和task的默认行为的总结:

1. 当Activity A启动Activity B时,ActivityA被终止,但是系统保留了它的状态(如滚动条的位置和录入表单的文本)。如果用户在Activity B中按回退按钮,Activity A会使用被保存的状态来进行恢复。

2. 当用户通过按主页(Home)按钮离开一个任务时,当前的Activity会被终止,并且被放入后台。系统会保留任务中每个Activity的状态。如果用户随后通过选择启动图标来恢复这个任务,那么任务会来到前台,并且恢复了堆栈顶部的Activity。

3. 如果用户按下回退按钮,当前的Activity会从堆栈中被弹出并且被销毁。堆栈中的前一个Activity会被恢复。Activity被销毁时,系统不会保留Activity的状态。

4. Activity能够被实例化多次,甚至来自其他任务。

 

 

 


原文链接:http://blog.csdn.net/fireofstar/article/details/7284550
加载中
返回顶部
顶部