在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到 原来某个Activity实例,而不是产生大量重复的Activity。
这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。
加载模式分类及在哪里配置
Activity有四种加载模式:
- standard
- singleTop
- singleTask
- singleInstance
设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
<activity android:name="ActB"android:launchMode="singleTask"></activity>
区分Activity的加载模式,通过示例一目了然。这里编写了一个Activity A(ActA)和ActivityB(ActB)循环跳转的例子。对加载模式修改和代码做稍微改动,就可以说明四种模式的区别。
Standard
首先说standard模式,也就是默认模式,不需要配置launchMode。该模式每次建立一个Activity时都重新创建一个实例。
SingleTop
singleTop和standard模式,都会将intent发送新的实例(后两种模式不发送到新的实例,如果已经有了的话)。不 过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。
singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。
SingleTask
singleTask模式和后面的singleInstance模式都是只创建一个实例的。
当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接 将intent发送给它。
如上图,建立Activity A,在A 中建立B,B中建立C,建立顺序用实线箭头标出。此时如果按回退键,则跳到了B,再按回退键,跳到A。回退顺序用虚线箭头标出。
SingleInstance
singleInstance模式下的Activity单独在一个task栈中。这个栈只有 一个Activity。
和上面的图比较这时B采用的是singleInstance模式,同样建立A,在A 中建立B,B中建立C。如果此时回退,则会先从C回退到A,再从A回退到B,回退顺序如图中虚线箭头所示。
原因是此时B和A、C不在同一个栈中,所以此时C要先回退到本栈的上下文当中,然后再将Task1栈移开,这时才显出Task2中的B。