Activity的启动模式
STANDARD
我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只有你创建了activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Actiivty则会在任务栈中销毁实例。
实例:
`protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activityTV= (TextView) findViewById(R.id.tv_activity);
standardBtn= (Button) findViewById(R.id.btn_standard);
activityTV.setText(this.toString());
standardBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this ,MainActivity.class);
startActivity(intent);
}
});
}`
其中的MainActivity就是标准启动模式,每次启动一次MainActivity都会去创建一个新的MainActivity
SingleTop模式
这种模式会考虑当前要激活的Activity实例在任务栈中是否处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。
分两种情况来看:第一种是A Activity启动A Activity:
`protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_b);
textView= (TextView) findViewById(R.id.tv_activity);
button= (Button) findViewById(R.id.btn);
button1= (Button) findViewById(R.id.btn_1);
textView.setText(this.toString());
Log.e("wj",this.toString());
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(BAct.this, BAct.class);
startActivity(intent);
}
});`
会发现如果A Activity位于栈顶,那么从A Activity启动A Activity的时候不会去创建新的A Activity 。会直接使用位于栈顶的Activity
第二种情况,A Activity的启动模式是SingleTop ,Activity的启动顺序是A–>B—>A,这时候发现B启动的A Activity是一个新的A Activity,并不是栈中存在的第一个A Activity,栈中存在的Activity一次是ABA。
因此,SingleTop启动模式当且仅当当且Activity在栈顶的时候,启动当且的Activity不会去重新实例化此Activity,如果要启动的Activity不在栈顶,那么跟Standard启动模式没有区别。
SingleTask模式
如果任务栈中存在该模式的Actiivty实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的onNewIntent()方法重用该Activity,使该Activity处于栈顶位置,否则就重新创建一个新的Activity实例。
注意此处重新启动已有的Activity的时候并不会调用该Activity的onCreate()方法,直接调用onNewIntent()方法
SingleInstance模式
当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的onNewIntent()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶,此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。