在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们放入任务栈中,当我们单击back键时,这些Activity会一一回退。任务栈是一种"后进先出"的栈结构,每一次back就会有一个Activity出栈,直到栈空为止,当栈中无任何Activity的时候,系统就会回收这个任务栈。
1.standard:标准模式(系统默认模式),每次启动一个Activity都会重新创建一个实例,不管这个实例是否已经存在。一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。当我们用ApplicationContext启动一个standard模式的Activity,会报AndroidRuntimeException错误,因为standard模式的Activity默认会进入启动它的Activity所属的任务栈中,但由于非Activity的Context并没有所谓的任务栈,所以报错。解决方案添加FLAG_ACTIVITY_NEW_TASK标记位,为它创建一个新的任务栈,实际上是以singleTask模式启动的。
2.singleTop:栈顶复用模式,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建。它的onNewIntent方法会被回调,但不会调用onCreate,onStart。如果新的Activity的实例已经存在但不是位于栈顶,那么新的Activity仍然会被创建。
3.singleTask:栈内复用模式,这是一种单实例模式,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,它的onNewIntent方法会被回调。singleTask默认具有clearTop的效果,会导致栈内所有在此实例之上的Activity全部出栈。
4.singleInstance:单实例模式,这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,就是具有此种模式的Activity,系统会为它创建一个新的任务栈,然后独自在这个任务栈中。