Android中Activity的启动模式有四种,分别是standard、singleTop、singleTask和singleInstance。
1、standard:标准模式。这也是Activity默认的启动模式。每次启动一个Activity都会重新创建新的Activity实例。不管这个Activity实例在任务栈中是否已经存在。被创建的Activity实例的生命周期符合典型情况下的Activity生命周期。
事例说明:此时有两个Activity,SecondActivity和ThirdActivity。当我们当我们从SecondActivity跳转到ThirdActivity再从ThirdActivity跳转到SecondActivity。我们可以发现SecondActivity被创建了两次。这就说明标准模式下的Activity不会复用,每次启动都会创建新的Activity实例。
2、singleTop:栈顶复用模式。这种模式下,如果要被启动的Activity实例已经位于任务栈的栈顶,则不再创建新的Activity实例。同时它的onNewIntent方法会被调用。通过这个方法我们可以取出当前请求的信息。需要注意的是,这个Activity的onCreate。onStart不会被调用。因为它并没有发生改变。如果新的Activity不是位于栈顶,那么新的Activity任然会被创建。例如现在任务栈中有ABCD,ABCD启动模式均为singleTop模式,A位于栈底,D位于栈顶,如果此时要启动C,那么任务栈的情况就会变成ABCDC。
3、singleTask:这是站内复用模式。这种模式下,只要Activity实例在任务栈中存在,启动的时候就不会去再次创建新的Activity实例,而是沿用已经存在的Activity实例。不论启动多少次,任务栈都只会存在一个Activity实例。这就是站内复用模式。和singleTop一样,系统启动Activity的时候,如果任务栈中存在该Activity实例,就不会调用onCreate和onStart方法,而是会调用onNewIntent方法。
singleTask站内复用模式的几种情况:
1)如果目前任务栈T1中存在ABC三个activity实例,这个时候Activity D以singleTask模式请求启动,其所需要的任务栈未T2.由于T2和D的实例都不存在,所以系统会首先创建T2,然后将D压入到T2中。
2)第二种情况,如果目前任务栈T1中存在ABCD三个activity实例,这个时候Activity D以singleTask模式请求启动,由于D已经存在T1的任务栈,所以D就不会被再次创建,而是直接沿用已经存在的D的实例。
3)第三种情况,如果目前任务栈T1中存在ADBC三个activity实例,这个时候Activity D以singleTask模式请求启动,由于D已经在T1中已经存在,同样不会再次创建,也是沿用已经存在的D的实例。同时会将位于D上面的其他Activity实例移出栈,使自己位于栈顶位置。
4、singleInstance:单实例模式。这种模式可以看成是singleTask的加强模式,它除了具有singleTask的模式所具有的一些列特性之外,还增加了一点特殊的特性。具有这种模式的activity只能单独的运行在独立的任务栈中。什么叫运行在独立的任务栈,其实就是如果Activity A是singleInstance模式,当A启动后,系统会为A创建一个新的任务栈使其独立运行在其中,这个栈中只有A自己不存在其他Activity实例。由于它也具有singleTask的复用的特性,在后续启动的时候,也会复用这个Activity。