在Android应用中,不可避免的会包含多个Activity,在默认情况下,连续开启多个Activity之后,按后退键,一般会回退到上一个Activity中,这一点和浏览器有点类似,但是与浏览器不同的是Android系统只能回退到上一个Activity,没办法前进到下一个Activity,维护这个功能需要了解到一个任务(Task)与回退栈(Back Stack)的概念。
当第一个Activity启动的时候,Activity的任务(Task)被创建,这第一个以及后续所有Activity被压入Task内部维护的回退栈(Back Stack)中。
本小节就Activity的任务(Task)与回退栈(Back Stack)的内容进行讲解。在有些书籍里,讲解到此内容的时候,会把任务与回退栈合并成任务栈(Task Stack)的概念进行讲解,其实与本小结的内容一致,而且通常它们是同生同源,不分彼此的,但是笔者更倾向于把它们分开进行理解。
讲解Activity的任务(Task)之前,先来简单了解一下什么是应用程序与进程。简单来说,应用程序是一组组件的结合体,而进程是在系统中运行这些组件的载体。对于Android应用而言,进程是针对它的所有组件来说的,但是任务(Task)只是针对Android四大组件中的Activity组件,它主要用于维护Activity的回退栈(Back Stack)。
每个任务(Task)内部都维护了一个回退栈(Back Stack),系统中可以同时存在多个任务(Task),但是每次只有一个任务(Task)获得前台的焦点,并显示其中回退栈(Back Stack)的Activity。一般而言,系统允许用户在多个任务(Task)之间进行切换,而被至于后台的任务(Task)中的Activity,将处于停止状态(Stopped)。实际上,哪怕是同一个任务(Task)中的Activity,只要不存在于回退栈(Back Stack)栈顶,并且是获得前台焦点的Activity,那么它都是处于一个停止状态(Stopped)。
下图诠释了任务(Task)前后台的关系:
每个任务(Task)内部都维护了一个回退栈(Back Stack),它只是针对Activity而言的,用来维护用户的界面体验。使一个任务(Task)让用户感觉起来就是一个应用,而察觉不到当前任务中的Activity是否来自同一个应用程序。
通常设备的Home页面是大多数任务(Task)的起始位置,当用户点击一个应用程序图标的时候,系统就会在前台新建一个任务(Task),并把默认打开的Activity压入回退栈(Back Stack)的栈顶,使它获取显示焦点,这个Activity被称为根Activity。回退栈(Back Stack)中的Activity可以通过点击回退键或者自行调用finish()方法从回退栈(Back Stack)中弹栈并销毁,这时会使回退栈(Back Stack)中上一个Activity获得焦点,直到用户返回到Home页面。当回退栈(Back Stack)中的Activity都被弹栈并销毁之后,这个任务(Task)就不复存在了,但是这个应用程序的进程依然存在着(进程不在此时销毁)。
在默认情况下,因为回退栈(Back Stack)以一个"栈"命名,所以内部也是维护了一个后进先出的栈结构。但是可以通过设置Activity的启动模式来改变栈内Activity的顺序,从而破坏这个后进先出的原则,下面详细来讨论Activity的启动模式。