Android Activity 启动方式
在mainfest文件中,activity标签有一个属性launchMode,它确定了当前Activity在Task栈中的运行模式,共分为四种模式:
- standard
如果在Activity标签中没有指明运行模式的话,系统会默认采用此种方式运行。
系统按照Intent的定义创建新的Activity实例并置入Task栈中。这个Activity可以被实例化多次,每一个实例可以放入不同的Task栈,同一个Task栈也可以包含多个Activity实例。
- singleTop
如果在当前Task栈的栈顶已经包含了这个Activity的实例,系统会将Intent信息通过onNewIntent()方法传入当前已经实例化的Activity中,而不是创建一个新的Activity实例。这个Activity可以被实例化多次,每一个实例也可以放入不同的Task栈,同一个Task栈也可以包含多个实例 (这必须满足一个条件,在Task栈的栈顶不存在一个Activity实例)。
举个例子,假设一个Task栈中包含根Activity A、Activity B、C以及位于栈顶的Activity D(在栈中自下而上的顺序为A-B-C-D; D在栈顶)。
1)此时一个Intent目标指向D,
如果Activity D的运行模式设置为"standard",一个新的Activity D的实例会被创建出来,现在的栈就会变成A-B-C-D-D;
如果 Activity D的运行模式设置为“singleTop”,由于Activity D已经位于栈顶,被实例化的Activity D就会通过onNewIntent()方法接收Intent的信息而不是创建新的实例化,现在的栈还是原来的状态A-B-C-D。
2)此时一个Intent目标指向Activity B,一个实例化的Activity B就会被创建并置入栈顶,即便是它的运行模式被设置为“singleTop”。
注意:当一个Activity的实例被创建时,用户可以通过按下返回键返回到前一个Activity。如果已经被实例化的Activity接收新的Intent,用户再按下返回键是不会回到调用onNewIntent()方法之前的状态的。
- singleTask
系统会创建一个新的Task并将实例化的Activity置入栈顶。如果在其他Task中已经存在这个Activity实例,系统不会创建新的Activity实例,而是将Intent信息通过onNewIntent()方法传入存在的Activity实例中,这种情况可以保证Activity只存在一个实例。
注意:由于Activity是在一个新的Task栈中启动,所以用户按下返回键依然可以返回到前一个Activity中。
- singleInstance
与“singleTask”类似,唯一的区别就是在当前运行这个Activity实例的Task中不会再压入任何其他的Activity实例,它是这个Task中仅有的也是唯一的成员。其他Activity的实例化都会触发新Task的创建。