通常在默认的情况下,当我们多次启动Activity的时候,系统就会默认将它们依次放入任务栈,当我们按下返回键的时候,这些Activity就会一一回退,这就相当于出栈。那么系统给我们提供了四种启动模式:
- standard 标准模式
- singleTop 栈顶复用模式
- singleTask 栈内复用模式
singleInstance 单实例模式
现在我们依次讲解:
standard
这是系统默认的启动的模式,每启动一个Activity,系统都会创建一个新的实例,它的onCreat(),onStart(),onResume()都会被调用。即使任务栈已经存在。例如:在FirstActivity中启动自己,就还是会创建自已的一个新的实例。
那么我们给出实例看看:
我们连续点击“启动本身”三次,看看Log
singleTop
这个模式下,就是,如果新启动的Activity已经处于栈顶,那么这个Activity就不会被重新创建,但是它的onNewIntent()会被回调,但是onCreat()、onStart()是不会回调的。如果新启动的Activity不是在栈顶,那么新的Activity依然会创建实例。
现在看看Log的信息,FirstActivity–>SecondActivity(singleTop模式)–>SecondActivity
如果是FirstActivity–>SecondActivity–>FirstActivity–>SecondActivity
看看第二次启动SecondActivity的时候,虽然SecondActivity的实例还是在栈内,但是不是在栈顶,所以依然会创建新的实例。
singleTask
这是一种单实例模式,只要启动的Activity的实例存在栈内,就不会重新创建实例,但是onNewIntent()会回调。假如现在栈内的情况是:ABC,A是栈底,C是栈顶,现在在本栈内创建D(singleTask),就会将D进栈,变成ABCD。
如果该实例不是在栈顶的话,如ADBC。那么在它前面的所有实例会Destory,而它就会处于栈顶,最终会变成AD。
当要启动的SecondActivity已经在栈顶,就相当于是singleTop。
若要启动的SecondActivity不是在栈顶,但是实例已经存在,那么它会调用onNewIntent,并且置于栈顶,在它之前的实例全部出栈。
singleInstance
这是一种加强的singleTask,它不仅具有singleTask的特性,还有就是此种模式的Activity只能单独存在于一个任务栈中。
新启动的任务的ID都不同了,所以就是说创建了一个新任务栈。之前的几种启动模式,它们的TaskId是一样。