1.activity的LaunchMode(启动模式)
为什么需要启动模式:当我们多次启动同一个activity的时候,系统会创建多个实例并把它们一一
放入任务栈中,当我们按返回键,会发现这些会一 一退出,任务栈是一种“后进先出”的栈结构。我们
会发现一个问题:多次启动同一个activity,系统重复创建多个实例,这样不是很傻吗?android在设计的时候不可能不考虑到这个问题,所以提供启动模式修改系统的默认行为:目前有四种启动模式:
standard,singletop,singletask,singleInstance
1)standard:标准模式,这也是系统默认的模式,每次启动一个activity都会重新创建一个新的实例,不管这个实例是否已经存在。被创建的实例的生命周期符合典型情况下的activity的生命周期,
2)singletop:栈顶复用模式,在这种模式下,如果新的activity已经位于任务栈的栈顶,那么此activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息,需要注意的是,这个activity的onCreate,onStart不会被系统调用,因为他并没有发生改变,如果新的activity实例已经存在但是不是位于栈顶,那么新activity仍然会重新重建。
3)singTask:栈内复用模式,这是一种单实例模式,在这个模式下,只要activity在一个栈中存在,那么多次启动此activity都不会重新创建实例,和singleTop一样,系统也会回调其onNewIntent,具体一点,当一个具有singTask模式的activity请求启动后,比如activityA,系统首先会寻找是否存在A想要的
任务栈,如果不存在,就重新创建一个任务栈,然后在创建A的实例后把A放到栈中,如果存在A所需的任务栈,这个时候要看A是否在栈中有实例的存在,如果实例存在,那么系统就会把 A 调到栈顶并调用他的onNewIntent方法,如果实例不存在,就创建A 的实例并把A压入栈中。
4)singleInstance:单实例模式,只是一种加强的singleTask模式,他除了具有singleTask模式的所有特性之外,还加强了一点,那就是具有此种模式的activity只能单独第位于一个任务栈中,换句话说,比如activityA 是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的activity,除非这个独特的任务栈被系统销毁了。