activity有四种启动模式:standard、singleTop、singleTask、singleInstance
standard:标准模式,不管是否存在,每次启动activity都会启动一个新的实例,被创建的activity符合典型情况下的生命周期。一个任务栈可以有多个实例,一个实例也可以有多个任务栈。比如Avtivity A 启动了Activity B,那么B会进入到A的任务栈中。
singleTop:栈顶复用模式。如果新的Activity已经位于栈顶,呢么Activity不会被创建,会回调onNewIntent 方法。如果新的activity已经存在但不是位于栈顶,那么activity依旧会被重建。
比如说栈内的情况为ABCD,D在栈顶,D的模式为singleTop,那么栈内依然为ABCD;如果D的模式为standard,那么栈内的情况为ABCDD.
singleTask:栈内复用模式,这是一种单实例模式。只要activity在一个栈中存在,那么就不会被重新创建。系统也会回调其onNewIntent 方法。当有一个singleTask模式的栈启动后,系统会首先寻找是否存在activity A所想要的任务栈,如果不存在,就会重新创建一个任务栈,并把新的Acticity放到新的栈中。如果存在A所需要的任务栈,然后就判断该栈中是否存在A的实例,如果不存在就会创建新的A,如果存在,就会把A调到栈顶,并调用其onNewIntent 方法。
比如:目前任务栈S1中的情况为ABC,activity D以singleTask的方式请求启动,其所需要的任务栈为S2,由于S2和D的实例均不存在,则系统会先创建栈S2,然后创建D实例并放入到S2中。
假如D所需要的栈为S1,那么S1已经存在,那么系统会直接创建D并把其放入到栈S1.
如果D所需要的栈为S1,S1内的情况为ADBC,那么此时D不会被创建,会把D调到栈顶并调用onNewIntent 方法,同时会导致栈内所有在D上面的activity全部出栈,S1内的情况变为AD。
singleInstance:单实例模式。这是一种加强的singleTask模式。他除了具有singleTask模式所有的特性外,还加强了一点,那就是具有此模式的activity只能单独的位于一个任务栈中。比如activity A以singleInstance的模式启动,系统会创建一个新的任务栈,然后A独自运行在这个新的任务栈中。由于栈内复用的特性,后续的请求均不会创建新的activity。
在singeleTask中涉及到activity所需的任务栈,那么什么是activity所需的任务栈?
TaskAffinity意为任务的相关性,标识了一个activity所需的任务栈的名字,默认情况下为包名。我们可以单独指定该属性,但属性值不能与包名相同,否则没有任何意义。TaskAffinity属性主要与singeleTask启动模式与allowTaskReparenting属性相对应使用,否则没有意义。当TaskAffinity属性与allowTaskReparenting属性相对应使用时,当一个应用A启动了应用B的某个activity后,如果这个activity的allowTaskReparenting属性设置为true的话。此activity会直接从A的任务栈转移到应用B的任务栈。
activity的启动方式:1,通过AndroidMenifest为activity指定启动模式 android:launchMode=”singleTask”
2,在 intent中设置标志位来为activity指定启动模式。
Intent intent=new Intent();
intent.setClass(MainActivity.this,secondActivity.class);
intent.addFlags(Intent.Flag_ACTIVITY_NEW_TASK);
startActivity(intent);
第二种方式的优先级更高,但无法为activity指定singleInstance模式,第一种方法无法直接为activity设置FLAG_ACTIVITY_CLEAR_TOP标识。
activity的Flags
常用的有如下几种:
FLAG_ACTIVITY_NEW_TASK:为activity指定singleTask的启动模式。
FLAG_ACTIVITY_SINGLE_TOP: 为activity指定singleTop的启动模式。
FLAG_ACTIVITY_CLEAR_TOP:当它启动时,所有位于它上面的activity都会出栈。