一个应用往往包含很多 activities .每个 activity 都 应围绕着用户可执行的特定动作来设计,并且可以启动其它 activitie .例如,一个 email 应用可能可能有一个显示新邮件列表的 activity .当用户选择一个邮件,一个新的 activity 被打开以显示邮件内容.
一个 activity 也可以打开同一设备上存在于其它应用的 activitie ,例如, 如果你的应用想要发送一个邮件,你可以定义一个 intent 来执行一个 "send" 动作并包含一些数据,比如一个地址和一条信息.另一个应用中的一个叫嚣自己可以处理这种 intent 的 activity 就被打开 ( 如果有多个 activitie 支持同样的 intent ,那么系统会让用户选择一个 ) .当 email 被发送后,你的 activity 被恢复并且看起来发送邮件的 activity 好 像是你的应用的一部分.即使那个 activitie 可能来自不同的应用, Android 也 靠着把两个 activity 保存在同一个任务中来实现这种无缝的用户体验.
一个任务是用户在执行某种工作时所交互的 activitie 的集合. activitie 们 放置 在一个栈 (" 后退栈 ") 中,按照打开的顺序排列.
设备的 Home 屏是大多数任务的开始场所.当用户触摸在应用启动台中的图标 ( 或一个 home 屏上的快捷方式 ) 时,应用的任务就来到了前台.如果没有这个应用的已存在的任务 ( 这个应用最近没有被使用 ) ,那么一个新的任务被创建并且这个应用的 "main"activity 被作为栈的根 activity 打开.
当当前的 activity 启动了另一个 activity ,新的 activity 被放置在栈顶并拥有焦点.先前的 activity 依然保存在栈中,但是停止了.当一个 activity 停止时,系统保存了它的用户界的当前状态.当用户后退按钮时,当前的 activity 被从栈顶弹出 (activity 被销毁了 ) 并且先前的 activity 被恢复了.栈中的 Activities 永不会被重新排列,只是入栈或出栈 — 当被当前 activity 启动时就入栈,当用户使用后退按钮离开它时就出栈.如此,后退栈也是一个后进先出的栈.
下图展示了工作栈的变化过程.
如果用户继续后退,那么栈中的各 activity 被弹出来展示上一个,直到用户退到 Home 屏 ( 或到达任务开始时运行的那个 activity) .当所有的 activitie 都从棧种移除,任务就不再存在.
一个任务是一个有聚合力的单元,它可以在用户启动一个新的任务或回到 home 屏时被整体地移到后台.当位于后台时,任务中的所有的 activitie 都处于停止,但是任务的后退栈却保存完整—当任务被另一个任务取代时,仅仅是失去了焦点.见图2:
图 2. 两个任务:任务 B 到了前台,任务 A 于是被打入后台,伺机恢复.
一个任务可以再回到前台,于是用户可以获得他离开时的模样.举个例子,当前的任务 ( 任务 A) 有三个 activitie 在其栈中—两个在下面.用户按下 Home 按钮,然后又启动一个新的应用.当 Home 屏出现时,任务 A 到了后台.当新应用启动时,系统为这个应用开始了一个任务 ( 任务 B) .当使用完新应用时,用户再次回到了 Home 屏然后选择了启动任务A的那个应用.现在,任务 A 来到了前台—其棧中所有的三个 activitie 都完整保留并且位于顶层的 activity 被恢复.此时,用户也可以再回到 home 屏然后选择任务B的应用于是回到任务B ( 或通过长按 Home 按钮以显示最近的任务然后选择它 ) .
注: 多个任务可以同时存在于后台.然而,如果用户在同一时刻运行多个后台任务,系统可能会销毁后台 activitie 来釋放内存,从而导致 activity 状态的丢失.
因为后退栈中的 activitie 从不会被重排,如果你的应用允许用户从不只一个 activity 启动一个特殊的 activity ,一个新的 activity 的实例会被创建并压入栈中 ( 而不是把这个 activity 的当前实例弄到前台来 ) .所以,你的应用中的一个 activity 可能被多次实例化 ( 甚至是从不同的任务 ) ,如图 3 所示 . 同样的,如果用户使用后退按钮向后导航, activity 的每个实例都会按照打开的顺序重新显现 ( 每个都保持它们自己的状态 ) .然后,你如果不想某个 activity 被实例化多次,你可以改变这种行为.后面会讲到如何做.
图 3 .一个 activity 被实例化多次.
下面总结一下下 activity 和任务的默认行为:
-
当 ActivityA 启动 ActivityB , ActivityA 停止,但是系统保存它的状态 ( 比如滚动条的位置和表单中输入的文本 ) .如果用户在 Activity B 中按下了后退按钮, ActivityA 以保 存的状态恢复.
-
当用户按下 Home 按钮离开了一个任务,当前的 activity 停止同时它的任务进入后台.系统保持任务中每个 activity 的状态.如果用户后来运行了这个任务的应用而恢复了这个任务,任务回到前台并使栈顶端的 activity 恢复.
-
如果用户按下了后退按钮,当前的 activity 从栈中弹出并被销毁.前一个 activity 被恢复.当一个 activity 被销毁时,系统不再保持 activity 的状态.
-
Activitie 可以被多次实例化,即使是从另外的任务.