Activity的启动模式:standard模式、singleTop模式、singleTask模式、singleInstance模式。
一、在AndroidManifest.xml中通过给activity标签指定android:launchMode属性来选择启动模式。
1、standard模式
这是一种默认模式。即不需要指明启动模式。
在这种模式下,不管该活动是否已存在返回栈中,每次启动都会创建该活动的一个新实例。
如:活动A中启动活动A,在启动活动A。此时的返回栈中有三个活动A的实例,需要按三次返回键才能退出程序。
(每次启动A都会创建新的活动A,即每次都会运行onCreate())
2、singleTop模式
android:launchMode=”singleTop”。
这种模式下,系统会先判断在返回栈中的栈顶是否已经是该活动的实例。如果是,则直接使用,不再创建新的活动实例;如果不是,系统还是会创建新的实例。
如:活动A设定为singleTop模式,在活动A中启动活动A,在启动活动A,此时的返回栈中只有一个活动A的实例,所以只需要按一次返回键就能退出程序。
(因为A已经是栈顶了,所以每次启动不会创建新的活动A)。
如:活动A设定为singleTop模式,在活动A中启动活动B,在活动B中启动活动A。此时的返回栈中有三个实例,分别为A->B->A,所以需要按三次back键才能退出程序。
(当活动A启动活动B时,返回栈的栈顶是活动B。当活动B启动活动A时,由于此时的栈顶不是活动A,所以还是会创建活动A。)
3、singleTask模式
android:launchMode=”singleTask”。
在这种模式下,系统会先判断在返回栈中是否存在该活动的实例。如果不存在,则创建一个新的活动实例;如果已存在,则直接使用,并将该活动之上的所有活动都移出栈。
如:活动A设定为singleTask模式,在活动A中启动活动B,在活动B中启动活动A。此时的返回栈中只有一个活动A的实例,所以按一次back键就能退出程序。
(当活动B启动活动A时,活动B被移出返回栈,即会运行活动B的onDestroy(),活动A重新成为栈顶活动,从onRestart()中恢复)
4、singleInstance模式
android:launchMode=”singleInstance”。
在这种模式下,系统会另外启用一个新的返回栈来管理这个活动,而且这个返回栈中只有这一个活动的实例。这种模式可解决共享活动实例的问题。
如:活动B设定为singleInstance模式,在活动A中启动活动B,在活动B中启动活动C。此时存在两个返回栈;一个栈的实例为:A->C;另一个栈的实例为:B;所以需要按三次返回键才能退出程序。
(第一次按back键时,会返回活动A,再按一次back键时,返回活动B,再按一次back键,退出程序。)
二、通过Intent的setFlags()来启动
setFlags(),接收一个参数。当传入的参数为:
1、Intent.FLAG_ACTIVITY_NEW_TASK
它是默认的跳转类型,它会重新创建一个新的Activity,如果不去设置android:taskAffinity 属性,就和标准模式一样了启动一个新的Activity。
2、FLAG_ACTIVITY_SINGLE_TOP
此种方式就相当于启动模式中的singletop
3、FLAG_ACTIVITY_CLEAR_TOP
此种方式就相当于启动模式中的SingleTask
4、FLAG_ACTIVITY_NO_HISTORY
此种方式就是说用这个FLAG启动的Activity,一旦退出,它不会存在于栈中,
比方说!原来是A,B,C这个时候再C中以这个FLAG启动D的,D再启动E,这个时候栈中情况为A,B,C,E。