活动的启动模式一共有4种,分别是:1.standard 2.singleTop 3.singleTask 4.singleInstance。我们可以在AndroidManifest.xml当中通过<activity>标签内的android:launchMode属性来选择合适的启动模式,下面对四种模式进行详细的说明。
1.standard模式
standard模式是活动默认的启动模式,在该模式下活动的运行原理如下:我们指定活动3的启动模式为standard模式,假如此时返回栈内活动为1,2,3。这时候如果我们又要重新启动活动3时,由于活动3启动模式是standard,系统不会在乎这个活动3已经位于返回栈的栈顶,而是重新创建一个新的活动3实例,这时候返回栈里存在的活动就是1,2,3,3,再重新启动活动3时就变成了1,2,3,3,3。总而言之,每调用一个standard模式的活动,就会直接创建一这个活动的实例。
2.singleTop模式
和standard模式相比,如果要启动一个singlTop模式的活动,假如这个活动已经在栈顶了,那么系统就不再创建该活动的实例,而是直接使用(调用onNewIntent()方法,再回调onResume()方法重用)。按照上面的例子,假如返回栈里面有活动1,2,3,我们指定活动3的启动模式为singleTop模式,此时重新启动活动3时,系统不会再创建一个活动3的实例,而是直接使用栈顶的活动3,此时返回栈里的活动仍然是1,2,3。不过当我们要启动活动1或者活动2时,由于活动1,2不在栈顶,系统还是会创建新的活动1,2实例。
3.singleTask模式
通过使用第二种singleTop模式可以很好的解决重复创建栈顶活动的问题,但是如果活动不在栈顶位置,我们还是需要再创建新的活动实例,那么怎么才能使整个返回栈内只存在活动的一个实例呢,这就用到了singlTask模式。在singlTask模式下,每次启动活动时系统都会在返回栈中检查是否存在该活动的实例,如果已经存在了,就会把该活动上面的所有活动全部出栈,使得该活动处于栈顶位置(同样调用onNewIntent()方法,然后回调onRestart()—>onStart()—>onResume()重用),如果不存在系统再创建活动实例。使用上面的例子,我们指定活动1的启动模式为singleTask,假如返回栈里有活动1,2,3,这时候系统想要重新启动活动1时,就会把活动2,3出栈,此时返回栈里的活动就只剩1了。
4.singleInstance模式
singleInstance模式比较特殊,当我们指定一个活动的启动模式为singleInstance时,如果需要启动这个活动,就会为这个活动单独创建一个新的活动栈。举个例子,假如返回栈(A)里已经有一个活动1,我们指定活动2的启动模式为singleInstance,当我们启动活动2时,系统就会创建一个新的返回栈(B),将活动2入栈到返回栈B,接下来如果又有活动3,4入栈,活动3,4会入栈到返回栈A,此时返回栈A里面存在的活动为1,3,4,返回栈B里面存在的活动为2。此时活动如果出栈,会先将返回栈A里面的活动4,3,1依次出栈,然后再将返回栈B里面的活动2出栈。