Android启动一个Activity有多种方式,可能是启动一个新的Acticity,也可能是重用之前已经创建的Activity实例;可能和之前的Activity位于同一个任务栈中,也可能是位于一个新的任务栈中。这些迥异的行为是由Activity的启动模式来决定的。众所周知的是Android有4中启动模式,分别是:Standard,SingleTop, SingleTask和SingleInstance. 现在我们就详细分析一下这四种启动模式的区别。
在Activity创建时,可以指定启动模式,如下:
上面这段代码中指定了启动方式是SingleTask。
需要注意的是还有属性taskAffinity的作用,如果taskAffinity和当前Application默认的taskAffinity不一致时,以SingleTask模式启动Activity时会找taskAffinity属性的栈,找到就在这个栈中找该Activity的实例,之后和前面介绍的一致,没有找到的话就会新建一个任务栈,并新建一个Activity的实例。
该模式启动的话会独自在一个任务栈中,不允许有其他元素的存在。如果以后是以该模式启动该Activity, 则仍然会使用该栈中的元素,不会再重新创建。
如果从BroadcastReceiver中启动Activity,或者是从Service向Activity跳转时,需要往Intent中添加FLAG_ACTIVITY_NEW_TASK 标记。
在Activity创建时,可以指定启动模式,如下:
<span style="font-family:FangSong_GB2312;"> <activity
android:name="com.wingsoft.fakecall.MainActivity"
android:windowSoftInputMode="adjustUnspecified|stateHidden"
android:configChanges="orientation|keyboardHidden"
android:launchMode="singleTask">
</activity></span>
上面这段代码中指定了启动方式是SingleTask。
1. Standard
顾名思义,标准模式。如果没有设定launchMode,则默认就是以该模式进行启动。每一次启动Activity都会重新新建一个Activity的实例。
2. SingleTop
以该模式启动时,如果当前的任务栈的栈顶就是该Activity的实例,则不会再创建新的实例,直接使用这个实例就好了;如果当前任务栈的栈顶元素不是该Activity的实例,则会重新创建一个新的实例,并放到任务栈的栈顶。3. SingleTask
该模式会在当前的任务栈中寻找是否有该Activity的实例存在,如果存在这样的实例,则系统会把该实例之上的实例都清除掉,以使得当前的实例位于栈顶。没有存在这样的实例的话则会新建。需要注意的是还有属性taskAffinity的作用,如果taskAffinity和当前Application默认的taskAffinity不一致时,以SingleTask模式启动Activity时会找taskAffinity属性的栈,找到就在这个栈中找该Activity的实例,之后和前面介绍的一致,没有找到的话就会新建一个任务栈,并新建一个Activity的实例。
4. SingleInstance
该模式启动的话会独自在一个任务栈中,不允许有其他元素的存在。如果以后是以该模式启动该Activity, 则仍然会使用该栈中的元素,不会再重新创建。
如果从BroadcastReceiver中启动Activity,或者是从Service向Activity跳转时,需要往Intent中添加FLAG_ACTIVITY_NEW_TASK 标记。
5. Task Affinity
Affinity 字面意思是“亲进性、亲和力”。Android 中Activity需要知道自己属于哪一个Task,这就是通过Affinity来决定的。标准的翻译是任务公用性。Affinity为运行一个或多个Activity的Task提供了一个静态的公共名称,默认的Affinity是实现该Activity的apk的包名。 当Intent的Flag不是 FLAG_ACTIVITY_NEW_TASK时,Affinity是不起作用的,只有设置了FLAG_ACTIVITY_NEW_TASK,Affinity才有作用。启动Activity时会检查当前的是否存在一个名字为Affinity属性值的Task,如果存在,就会将这个Task切换到前面,并将新创建的Activity放置到该Task的顶部;如果没有这个Task就会新建这样一个Task,并将Activity放置到该Task的顶部