Android Activity的启动模式和各自的特点

在Android中,Activity的启动方式一共有4种:

  • standand
  • singleTop
  • singleTask
  • singleInstance

默认的启动方式是standand,设置启动方式的方法是在manifest注册文件中在需要设置启动方式activity中添加android:launchMode属性。

在介绍各个启动方式之前,需要对Android任务栈进行说明。

当一个App启动时,如果当前环境中不存在这个App的一个任务栈,那么会先创建一个任务栈来对以后可能产生的Activity进行管理。

对于栈结构,大家都很熟悉了的,就是一个“后进先出”的规则,需要注意的是,一个任务栈内的Activity可以来自不同的App,一个App的Activity也可以在不同的任务栈中。

standand

在standand模式下,每次启动一个Activity就会产生一个新的实例,而不管这个Activity是否相同,新创建的实例会覆盖在原来那个Activity之上。举例来说,应用只有一个MainActivity,创建之后点击跳转还是跳转到MainActivity,点击跳转2次,那么这个时候任务栈中会有3个序列号不同的MainActivity实例。

singleTop

顾名思义,就是栈顶复用模式。在启动一个Activity之前会检查任务栈的栈顶的Activity是不是即将要启动的Activity,如果是,那么就不会新建一个Activity而是直接复用这个Activity。如果不是那么就会重新创建,注意只是检查栈元素。

singleStack

这个和singleTop是很像的,但是注意这个是栈复用,也就是说当我们想要启动一个Activity时,会在整个任务栈内查找是否有将要启动的Activity,如果有,那么会将这个Activity之上的Activity都清除掉,将这个Activity重新呈现在栈顶的位置,也就是说这种启动模式有清除栈顶的作用。
需要注意的是,如果这个Activity已经在后台的一个任务栈中了,那么这个后台任务栈也会被切换到前台。

singleInstance

单实例模式,也就是说每一个任务栈种只有一个Activity的实例,每次启动一个新的Activity时都会新建一个任务栈然后将他的实例放进去。举个例子,应用A使用singleInstance模式创建了MainActivity的一个实例,应用B也需要激活MainActivity,那么B会不需要新建,而是和A复用这个任务栈中的MainActivity的实例。

适用场景

singleTop适用于用于接受消息后需要显示的页面,比如说qq接收到消息后需要弹出Activity,如果一次来了多条消息,那总不能一次弹出好几个Activity页面吧,打开一个之后Activity在栈顶,后面的就可以直接复用了。

singleTask适用于程序的入口。比如说浏览器的主页面,不管多少个应用启动浏览器,首先打开的都是主页面,并且如果之前有打开的页面也会被清除掉。

singleInstance适用于需要与程序分离的页面,比如说闹钟提醒页面。

结语

这里只是对4中启动方式做了简单的总结,没有详述,另外只有文字说明可能对任务栈的理解不够深刻,这里推荐上Android开发者网站上看,有启动模式的任务栈的情况说明图,另外,下面的一篇blog写的很详细很生动: