activity:launchMode
指示activity如何启动,有四种模式:
"standard"
"singleTop"
"singleTask"
"singleInstance"
可在AndroidManifest.xml配置<activity>的android:launchMode属性。
1、 Standard(默认)
每次都生成新的实例,下面以一个例子说明,新建AActivity,使用默认launchMode,代码如下:
package test.stack;
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.TextView;
public class AActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("A");
TextView txt = (TextView) findViewById(R.id.tx);
txt.setText(this.toString());
Button btn = (Button) findViewById(R.id.button);
btn.setText("A");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent in = new Intent(AActivity.this,AActivity.class);
startActivity(in);
}
});
}
}
AActivity界面中的TextView用于显示当前Activity实例的序列号,Button跳转到下一个AActivity界面。

连续2次点击A按钮,会出现下面现象:


输出日志:

连续按三次返回才能回到桌面。
2、SingleTop
一般情况和Standard一样,生成新的实例,不同之处是如果activity处于栈顶,不再生成新的实例,新建BActivity,<activity>指定属性android:launchMode="singleTop",代码如下:
package test.stack;
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.TextView;
public class BActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("B");
TextView txt = (TextView) findViewById(R.id.tx);
txt.setText(this.toString());
Button btn = (Button) findViewById(R.id.button);
btn.setText("B");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent in = new Intent(BActivity.this,BActivity.class);
startActivity(in);
}
});
}
}
AActivity中改为点击AActivity跳转到BActivity,操作点击A,连续点击两次B,情况如下:




BActivity在栈顶没有生成新的实例,按一次返回,直接返回AAcrivity。
3、SingleTask
SingleTask,不再生成新的实例,并且如果发现有相同的实例,则使同一栈中该实例以上的activity的实例出栈, 新建CActivity,<activity>指定属性android:launchMode="singleTask",代码如下:
package test.stack;
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.TextView;
public class CActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("C");
TextView txt = (TextView) findViewById(R.id.tx);
txt.setText(this.toString());
Button btn = (Button) findViewById(R.id.button);
btn.setText("C");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent in = new Intent(CActivity.this,BActivity.class);
startActivity(in);
}
});
}
}
同时修改AActivity,BActivity代码,形成跳转顺序为A->C->B->C,如图:



日志输出如下:

按返回,C直接回到A,B已出栈
4、singleInstance
不再生成新的实例,同时位于新的栈结构,并且该栈只有唯一实例,新建DActivity,,<activity>指定属性android:launchMode="singleInstance",代码如下:
package test.stack;
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.TextView;
public class DActivity extends Activity {
/** Called when the activity is first created. */
TextView txt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("D");
txt = (TextView) findViewById(R.id.tx);
txt.setText(this.toString());
Button btn = (Button) findViewById(R.id.button);
btn.setText("D");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent in = new Intent(DActivity.this,BActivity.class);
startActivity(in);
}
});
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
}
同时修改AActivity,BActivity代码,形成跳转顺序为A->D->B->A->D->B,输出日志如图:

依次按返回,形成的顺序为B->A->B->A->D,D在新的栈中,A所在栈的实例都出栈后才会显示D.
浙公网安备 33010602011771号