(4.1.2.3)Tasks and Back Stack原理

一、参考文章  
        原文地址: Tasks and Back Stack  
        本地地址: 
Java代码   收藏代码
  1. .\android-sdk-windows\docs  
  2. \guide\topics\fundamentals\tasks-and-back-stack.html  

二、术语解释  
        1.task:一系列activity的集合,这些activity就可以看成是一个任务。 
        2.back stack:一系列activity的存储结构,因其遵循后进先出的原则,所以我个人译为“回退堆栈”, 但本文仍沿用英文代表其原义 。 

三、本文主旨  
        Android推崇一种用户体验方式,即不同应用程序之间的切换能使用户感觉就像是同一个应用程序,很连贯的用户体验,官方称其为seamless (无缝衔接);那么,这种用户体验的实现原理是怎样的? 

四、BackStack原理  
        我们首先来看一个图,该图展示了多个activity之间的切换并以时间线为线索展示这种行为,有些类似与UML中的时序图, 

如下: 

(4.1.2.3)Tasks and Back Stack原理_第1张图片



        要想理解此图,首先一定要弄明白什么是堆栈,堆栈的特性后进先出(LIFO),两个主要操作压入(push)和弹出(pop)。 

        我们在来看图中的back stack,栈顶的activity都是用户当前看到的activity;每当用户切换到一个新的activity时, 

Android就会将其压入到stack back,使其成为栈顶,也就是用户当前看到的activity;栈顶后面的activity此时呈stop状态,对应着Activity生命周期方法中的onStop(),并且Android还会保留其状态(比如文本框上的文字等)。这是压入操作。 

        当用户按下BACK键,Android就会将back stack顶部的activity弹出来,紧随其后的activity顶上去,就实现了回退的功能。被弹出的activity此时呈destroy状态,对应着onDestroy(),新栈顶activity呈resume状态,对应着onResume()。这是弹出操作。 

        这个底层原理弄明白之后,高层的执行流程就很容易理解了,这里不做说明了。利用堆栈这种数据结构的特点很好地实现了“无缝衔接”的用户体验,而且效率也是蛮高的, 

五、任务原理  
        再来说说任务,根据“术语解释”当中介绍的,一个任务里面肯定会包含一个back stack,如果没有back stack的话,那么任务也就会结束了。理解这一点,我们可以引出下文。 

        任务的生命周期,简约版: 
        1.任务开始,按HOME键(这里要提出的是,如果你选择的应用程序先前没有打开过,也就是说没有开始一个任务,才会新 

建一个任务)。 
        2.任务结束,一直按BACK键,直至回到HOME界面(未必只有此方式,有可能还是Android系统为回收内存而强行结束任务)。 

        任务的特点——聚合性: 
        所谓聚合性,指的就是任务中的那些activity会作为一个整体进行移动操作,比如将该任务放置到后台或前台。如下图: 
 

        此图描述的就是Android中的多任务场景,任务A和任务B内部都含有一个back stack,两个back stack互不干扰;当想切换回任务A时,只需按HOME键,再去选择先前的那个应用程序的icon即可。 

        另外针对任务,原文还指出了另外一个特性,同一个任务或不同任务中都可以保有多个相同的activity,如下图: 
(4.1.2.3)Tasks and Back Stack原理_第2张图片 


        此特性是受back stack的特性限制而造成的,堆栈是一个LIFO的数据结构,所以说你不能够随便地更改它的数据顺序,因此上图中就有两个的Home Activity,但它们并不是同样的实例,而且状态也都是不一样的。 

六、总结  
        起初看到这块的时候,并不理解“无缝衔接”到底讲述的是啥意思;突然某一天在网上看到一个Android新款手机视频介绍,视频上那人用触屏的方式展示了那款手机的新功能,操作起来非常得行云流水,连贯性极强,之后我就明白了这就是传说中的“无缝衔接”的用户体验,所以就在此基础上学习并翻译了这篇文章,达到了事半功倍的效果。 

你可能感兴趣的:(android,Activity,task)