activity一共有四种启动模式,启动模式和Task密切相关
1,standard,一个Task中可以有多个相同类型的Activity(不是同一个Activity对象),例如一个Task中有A,B,C三个Activity,如果再启动A类的Activity,则Task中的顺序就为A,B,C,A。standard为activity的默认启动模式。
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private static final String TAG="MyTestActivity";
private TextView text;
private Button btnClick;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text=(TextView) findViewById(R.id.text);
text.setText(this.toString());
btnClick=(Button) findViewById(R.id.click);
btnClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent(MainActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
2, singleTop,在AndroidManifest.xml文件中将MainAcitivity的启动属性 android:launchMode="singleTop">
可以发现,点击多次按钮,TextView中显示的ID始终是一样的,这也证明,当Task栈顶所代表的是要找的activity时,就不会再去生成新的实例。如果栈顶的activity不是设置了此属性,那么即使task中已经有了该activity,照样会生成一个新的此类的实例。
3, singleTask
如果activity启动模式设置为此属性,那么在一个Task里面只有一个此Activity的实例,如果此activity不在栈顶,那么就将此activity之上的其他activity统统出栈,使此activity位于栈顶显示出来。
4, singleInstance
启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入,
从FirstActivity跳转到SecondActivity时,重新启用了一个新的栈结构,来放置SecondActivity实例,然后按下后退键,再次回到原始栈结构;图中下半部分显示的在SecondActivity中再次跳转到FirstActivity,这个时候系统会在原始栈结构中生成一个FirstActivity实例,然后回退两次,注意,并没有退出,而是回到了SecondActivity,为什么呢?是因为从SecondActivity跳转到FirstActivity的时候,我们的起点变成了SecondActivity实例所在的栈结构,这样一来,我们需要“回归”到这个栈结构。