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