Android task和back stack

  次阅读 作者:智能小宝 来源:互联网 2016-01-13 21:55 我要评论(0)

一个应用往往包含很多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可以被多次实例化,即使是从另外的任务.

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...