1、standard
之前已经学习了安卓的活动是返回栈管理的,新建的活动都会在栈顶。在这种模式下创建的活动,系统不会管在返回栈中是否存在,每次都会创建新的实例。
比如现在新建一个FirstActivity活动,然后定义一个按钮,每次点击这个按钮会跳转到FirstActivity,也就是自己。下面是点击两次跳转之后的结果:
2、singleTop
我们发现前一种模式的不合理:命名活动已经在栈顶了,为什么还要新建同一个活动呢?所以singleTop就解决了这个问题:当新建活动时,如果这个活动已经在栈顶,就不新建。
还是刚刚的程序,再次点击按钮,发现LogCat里面没有输出新的信息。
现在修改这个程序:点击跳转的时候跳转到另一个活动SecondActivity。先从FirstActivity进入SecondActivity,再回到FirstActivity。这个例子是为了说明singleTop解决了同一个活动在栈顶的问题,但没有解决不在栈顶的情况:
3、SingleTask
当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
在之前的例子的基础之上,首先修改FirstActivity的启动方式为SingleTask,然后修改FirstActivity的onRestart函数:
此时重复之前的步骤,得到下面的LogCat:
这个例子说明了singleTask的模式可以减少重复的活动,但是也说明这个模式可能会带来的问题:之前在写拍照活动的时候,如果把调用拍照活动的底层活动定义为singleTask,会导致拍照之后,程序崩溃的情况。原因我认为可能是拍照的活动完成后,调用底层活动,然后把拍照的活动destroy了。最后要调用onActivityResult的时候就会发生错误。
所以singleTask看起来很美好,却不是随便可以用的!
4、singleInstance
这个模式主要用在不同的程序共享同一个活动。之前的三种模式没办法做到,因为每一个程序都有自己的返回栈,不可能共享同一个活动。而使用singleInstance启动的活动会有单独的返回栈。
下面开始修改工程:首先更改SecondActivity的启动方式为singleInstance,然后修改FirstActivity中的代码:
SecondActivity也是这样修改。然后创建ThirdActivity,同样按照上面的代码修改。
现在从FirstActivity跳转到SecondActivity,再跳转到ThirdActivity,看LogCat的结果:
可以看到SecondActivity的taskid和其他两个活动都不同,证明SecondActivity确实有单独的返回栈,而且这个返回栈只有它一个活动。
现在如果点击返回,ThirdActivity会回到FirstActivity因为它们两个在同一个返回栈中,再次点击返回才会回到SecondActivity。