1.LaunchMode
四种模式
1.1 standard
系统默认模式,每次启动都会重新创建一个新的实例,不管其是否存在实例。这是一种典型的多实例实现,一个任务栈中可以有多个实例,没个实例也可以属于不同的任务栈。谁启动这个Activity那么这个实例就属于哪个Activity所在的栈中。
当你用非Activity类型的Context(如ApplicationContext)去启动一个standard模式的Activity时候会报错:
E:/AndroidRuntime(674) android.util.AndroidRuntimeException: Calling startActivirty from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
这是因为非Activity类型的Context没有所谓的任务栈。解决方法就是为代启动的Activity指定FLAG_ACTIVITY_NEW_TASK 标记位,创建一个新的任务栈
1.2 singleTop
栈顶复用模式。在这种模式下,新的Activity已经位于任务的栈顶,那么此Activity不会重新被创建,同时会执行onNewIntent方法,通过此方法我们可以取出当前请求的信息。并且该Activity的onCreate,onStart,不会被系统调用。如果新Activity的实例已存在但不位于栈顶,那么新的Activity仍然会重新创建。
1.3 singleTask
栈内复用模式。这是一种单实例模式,这种模式下,只要Activity在一个栈中存在,那么多次启动该Activity都不会重新创建实例,和singleTop一样,系统也会调用onNewIntent获取请求信息
举例:(1) 栈S1 存在实例A,B,要在栈S2启动实例C(singleTask模式下),则栈S2,和C都会被创建。
(2)在1的前提下,在S1启动C,由于S1已存在,系统直接创建C并将其入栈道S1。
(3)如果栈S1存在顺序ACBD的实例,由于C实例已存在,根据栈内复用原则,C实例不会重新创建,调用其onNewIntent方法,同时singleTask默认具有clearTop的效果,故会把栈内C上面的实例全部出栈,最终S1上只有AC。
1.4 singleInstance
单实例模式。这是一种加强的singleTask模式,他除了具有singleTask的所有属性外,还加强了一点,此模式下Activity只能单独的位于一个任务栈中。比如Activity A是singleInstance模式,当A启动后,系统会为它重新创建一个新的任务栈,由于栈内复用特性,后续请求均不会创建新的Activity A。