一、参考文章
原文地址:
Tasks and Back Stack
本地地址:
.\android-sdk-windows\docs
\guide\topics\fundamentals\tasks-and-back-stack.html
二、术语解释
1.task:一系列activity的集合,这些activity就可以看成是一个任务。
2.back stack:一系列activity的存储结构,因其遵循后进先出的原则,所以我个人译为“回退堆栈”,
但本文仍沿用英文代表其原义。
三、本文主旨
Android推崇一种用户体验方式,即不同应用程序之间的切换能使用户感觉就像是同一个应用程序,很连贯的用户体验,官方称其为seamless (无缝衔接);那么,这种用户体验的实现原理是怎样的?
四、BackStack原理
我们首先来看一个图,该图展示了多个activity之间的切换并以时间线为线索展示这种行为,有些类似与UML中的时序图,
如下:
要想理解此图,首先一定要弄明白什么是堆栈,堆栈的特性后进先出(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,如下图:
此特性是受back stack的特性限制而造成的,堆栈是一个LIFO的数据结构,所以说你不能够随便地更改它的数据顺序,因此上图中就有两个的Home Activity,但它们并不是同样的实例,而且状态也都是不一样的。
六、总结
起初看到这块的时候,并不理解“无缝衔接”到底讲述的是啥意思;突然某一天在网上看到一个Android新款手机视频介绍,视频上那人用触屏的方式展示了那款手机的新功能,操作起来非常得行云流水,连贯性极强,之后我就明白了这就是传说中的“无缝衔接”的用户体验,所以就在此基础上学习并翻译了这篇文章,达到了事半功倍的效果。