Activity的启动模式

来源:互联网 发布:中世纪2王国优化9补丁 编辑:程序博客网 时间:2024/06/06 13:59

目前Activity有四种启动模式:standard,singTop,singleTask,singInstance

1.standard:标准模式,这也是系统的默认模式,每次启动一个Activity都会重新创建一个实例,在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中,比如A启动了B(standard模式),B就会进入A所在的栈中

2.singTop:栈顶复用模式。在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息,这个Activity的onCreate、onStart不会被系统调用。

3.singleTask:栈内复用模式,这是一种单实例模式,在这种模式下,只要Activity在所需的栈中存在,那么多次启动此Activity都不会重新创建实例,系统会回调其onNewInstent方法。

4.singInstance:单实例模式,这是一种加强的singleTask模式,具有此种模式的Activity智能单独位于一个任务栈中,换句话说,比如A是singleInstance模式,当A启动后,系统会为他创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了。


所需的栈:这要说起参数TaskAffinify,可以翻译为任务相关性,是一个字符串,并且必须含有分隔符“.”,这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名,该参数主要和singleTask启动模式或者allowTaskReparenting属性配对使用,其他情况下没有意义。当TaskAffinity和singleTask启动模式配对使用的时候,它是具有该模式的Activity的目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中;当TaskAffinity和allowTaskTeparenting结合的时候,这种情况比较复杂,会产生特殊的效果,当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskTeparenting属性为true的话,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。

启动模式的设置:

第一种:清单文件中设置

<activity    android:name=".SecondActivity"    android:launchMode="singleTask"></activity>
第二种:代码中设置

Intent intent = new Intent(MainActivity.this,SecondActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);
两种启动模式的区别:

1.优先级。第二种高于第一种

2.限定范围。比如:第一种无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法为Activity指定singleInstance模式。

Activity常用的Flags:


原创粉丝点击