一.在android中有几种启动Activity的模式?
standard(默认):每次都会新建。(每个Task都可以有,且可以有多个实例)。
singleTop:当前实例如果在栈顶,就不可以新建实例。(每个Task都可以有,且可以有多个实例,在栈顶的时候可以复 用)
singleTask:新建一个Task,如果有其它Task包含此实例,就直接调用那个Task。(只存在一个Task中)
singleInstance:新建一个Task,且该Task中只有其一个实例。(只存在一个Task中,且此Task中只有此一个实例)
其次有必要先解释下Task这个概念:Task就是栈的意思,一个android应用的创建,则创建了一个Task,当每创建一个activity的时候,就将activity压入Task中。
设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
接下来以Demo的形式分别解释这四种模式:
standard:
再次我们定义一个类A,通过A->A,再返回的形式来展现。
package com.android.douf;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class LaunchModeActivity_A extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText(this + "");
Button button = new Button(this);
button.setText("go:");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(LaunchModeActivity_A.this, LaunchModeActivity_A.class);
startActivity(intent);
}
});
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(textView);
layout.addView(button);
this.setContentView(layout);
}
}
通过结果我们可以看见当不断点击按钮生成的是不同的对象实例。再点击返回按钮的时候,返回上一个对象实例。
其实这就相当于一个压栈的过程。
singleTop:其实singleTop和standard的区别就在于其创建的实例是否在栈顶。
此时我们将刚才那个Demo的launchMode改成standard。
此时发现不管点击多少次按钮,都是同一个实例。且当按back健的时候,退出程序了。原因很简单,因为类LaunchModeActivity_A是在栈顶。
singleTask:
定义A类跳转到B类,再定义一个B类跳转到A类。其中设置A类的启动方式为:singleTask。B类的启动方式为:standard。
A类:
package com.android.douf;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class LaunchModeActivity_A extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText(this + "");
Button button = new Button(this);
button.setText("go:");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(LaunchModeActivity_A.this, LaunchModeActivity_B.class);
startActivity(intent);
}
});
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(textView);
layout.addView(button);
this.setContentView(layout);
}
}
B类:
package com.android.douf;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
public class LaunchModeActivity_B extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button=new Button(this);
button.setText("go actA");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setClass(LaunchModeActivity_B.this, LaunchModeActivity_A.class);
startActivity(intent);
}
});
LinearLayout layout=new LinearLayout(this);
layout.addView(button);
this.setContentView(layout);
}
}
结果会发现A跳转到B,创建了一个新的实例,当B再跳转到A时,仍然是刚才的实例。因为启动A的方式是singleTask。A中包含了此实例,所以当再次启动的时候intent会直接传递给这个已创建的实例对象。
singleInstance:在这个模式之下,activity独享一个Task,此时一个Task只有一个activity。
仍然使用上面的A和B类,将A类的启动模式改为standard,把B的启动模式改为singleInstance。
当点击跳转A到B,再从B跳转到A,然后back的时候,一般情况下应该是跳到B界面,但是这次全是A界面,并且当B
跳转到A得时候创建一个新的实例在另一个Task中,并非同一个Task,结果如下图: