一、standard
默认启动模式,每次激活Activity时都会创建Activity实例,并放入Activity栈中。
例如:一个Activity名为A1,上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启动一个Activity A1实例叠在刚才的A1之上。
Intent intent=new Intent(MainActivity.this,MainActivity.this); startActivity(intent);
二、singleTop
可以有多个实例,但是不允许此Activity的多个实例叠加。即,如果此Activity有实例在栈顶的时候,启动这个Activity,不会创建新的实例,而会调用其onNewIntent方法。如果不在栈顶则创建新的实例。
例如:有两个Activity名为B1,B2,B1为standard,B2为singleTop。若我打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法。若我打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图一样。)
android:launchMode="singleTop"
三、singleTask
只有一个实例,在同一个应用程序中启动他的时候,若不存在此Activity实例,则会在前栈创建一个新的实例,若存在,则会把栈中在其之上的其他Activity实例销毁掉,并调用此实例的onNewIntent方法。如果是在别的应用程序中启动它,则会新建一个栈,并在该栈中启动这个Activity,然后我在这个activity实例中再打开新的Activity,这个新的Activity实例会在一个栈中。
例如:应用程序中有三个Activity,C1,C2,C3,三个Activity可互相启动,其中C2为singleTask模式,那么无论在这个程序中如何点击启动,都只会存在一个C2(C1和C3可能存在多个实例),并且这三个Activity都在同一个tack里面。并且启动singleTask模式的activity会把task中在其之上的其它Activity实例销毁掉。
四、singleInstance
只有一个实例,并且这个实例独立运行在一个activity任务栈(task)中,这个task只有这个实例,不允许有别的Activity存在。
例如:
有三个Activity分别是D1,D2,D3,三个Activity可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。
假设D2的taskId为201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的task中。
若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这时再从D2启动D1或者D3则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3个task了。
保存和恢复activity的状态:
保存状态activity的状态
String str="lalala"; @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub outState.putString("str",str); super.onSaveInstanceState(outState); Toast.makeText(this, "onSaveInstanceState", Toast.LENGTH_SHORT); }
恢复状态activity的状态
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); if(savedInstanceState==null) return; String str=savedInstanceState.getString("str"); Toast.makeText(this, str, Toast.LENGTH_SHORT); }