Activity启动模式

来源:互联网 发布:eos utility for mac 编辑:程序博客网 时间:2024/06/08 03:25

Android是使用任务(Task)来管理Activity的,一个任务就是一组存放在栈里的Activity的集合,这个栈也被称为返回栈(Back Stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动一个新的Activity,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或者调用finish()方法去销毁一个活动时,处于栈顶的Activity会出栈,这时前一个入栈的Activity就会重新处于栈顶的位置。我们这里提到的是默认的情况,当然还有其它的几种情况,这里就涉及到我们Activity的启动模式。

Activity总共有四种不同的启动模式,分别为standard、singleTop、singleTask和singleInstance,我们可以在AndroidMainifest.xml中通过<activity>标签指定android:launchMode属性来选择启动模式。

1、standard是Activity默认的启动模式,在该种模式下,每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。对于该种模式启动的Activity,不管该Activity是否存在于返回栈中,都会为该Activity创建一个新的实例。比如:当前返回栈中有ActivityA,这个时候再通过standard模式启动ActivityA,此时,返回栈中的活动便为AA,再启动一个ActivityB,这个时候返回栈中的Activity便为AAB;

2、singleTop,当Activity的启动模式指定为singleTop,在启动Activity时如果发现返回栈栈顶已经是该Activity,则认为可以直接使用该Activity,而不需要重新创建一个新的实例。比如:当前返回栈中Activity为ABC,我们再次创建一个ActivityC,此时,系统直接使用了返回栈栈顶的ActivityC,而不再重新创建,这个时候的返回栈中的Activity还是为ABC。假如我们再次创建的Activity为B,那么则重新创建一个新的实例B,这个时候返回栈的活动为ABCB。因此,singleTop启动模式可以很好解决重复创建栈顶Activity的问题;

3、singleTask,当Activity不存在于栈顶,我们使用standard和singleTop启动模式的话还是会重新创建新的Activity实例。如果,我们需要保证某个Activity在整个应用程序的上下文中只存在一个实例,这个时候就需要使用到singleTask启动模式来实现了。当Activity的启动模式指定为singleTask,每次启动Activity时系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在 则直接使用该实例,同时,把在这个Activity之上的所有Activity通通出栈,如果没有发现该实例的存在,则重新创建一个新的实例 。比如:当前返回栈中的Activity为ABC,我们再次创建一个ActivityB,此时,系统判断到ActivityB存在于返回栈中,直接使用该实例并将其上面的所有Activity出栈,这个时候的返回栈就为AB。假如我们再次创建的Activity为D,那么系统判断到Activity D不存在于返回栈中,那么则重新创建一个新的Activity D实例,这个时候的返回栈为ABCD。

4、singleInstance,该启动模式不同于上面三种启动模式,指定为singleInstance模式的Activity会启动一个新的返回栈来管理这个活动(如果singleTask模式指定了不同的taskAffnity也会启动一个新的返回栈)。比如,当前返回栈1中的Activity为A,当以指定singleInstance启动Activity B时,这个时候会创建一个新的返回栈2,其中的Activity为B,这个时候再以standard启动模式启动Activity C,这个时候返回栈1中的Activity就为AC,而返回栈2中的Activity为B,当前Activity 在前台,我们按下Back键时,由于AC在同一个返回栈中所以返回到Activity A,再按一次Back键,我们才返回到B,我们可以通过Activity中的getTaskId()方法来获取当前Activity所在返回栈的Id值,以此判断两Activity是否处于同一个返回栈中。

0 0
原创粉丝点击