Android 开发中我们打交道最多的就是Activity,Activity 有四种启动模式,每一种启动模式都代表着特定的使用场合了解Activity 的启动模式,可以对我们使用Activity得心应手。
Activity Standard启动模式
standard是我们使用activity 的标准模式,大部分全部是默认standard模式,也称默认模式
代码如下,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
tv.setText("当前activity是:" + this.toString()+"\n"+"当前TaskID:"+getTaskId());
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,MainActivity.class));
}
});
}
两幅图让你清晰明了的懂
当前MainActivity实例是 3364163
当前MainActivity的TaskID是:13
我们再去启动一个当前Activity 后,
可以看到再次开启的MainActivity
实例是 436f4f9
TaskID 是 13
由此我们可以得出结论:
Standard模式下,所有的Activity全部是在一个堆栈中,每一个Activity都是一个单独的实例,当我们按返回键的时候,弹出栈顶的activity实例,然后在顶部activity下面的Activity显示出来,占据栈顶!
Activity SingleTask 启动模式
先看代码
MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
tv.setText("当前activity是:" + this.toString()+"\n"+"当前TaskID:"+getTaskId());
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,MainActivity.class));
}
});
findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,BActivity.class));
}
});
}
BActivity :
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
tv = (TextView) findViewById(R.id.tv);
tv.setText("当前activity是:" + this.toString() + "\n" + "当前TaskID:" + getTaskId());
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(BActivity.this, MainActivity.class));
}
});
findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(BActivity.this, BActivity.class));
}
});
}
步骤:
- 初始化MainActivity,先启动BActivity
- 在BActivity中启动MainActivity
此时,如果我们点击返回键,就会推出程勋,回到手机界面。
分析:
步骤1 的时候,在堆栈中产生了2个activity实例,MainActivity和BActivity ,接着去步骤2,这时候有了变化,因为堆栈中存在MainActivity实例,所以我们不会再去新创建一个新的MainActivity实例,而是把存在堆栈底部的MainActivity实例拿出来使用,那么问题来了,怎么拿出来??
很暴力的,MainActivity直接把在他上面的BActivity 弹出了堆栈,自己占据栈顶!此时,堆栈中只有MainActivity一个实例,所以按返回键,就自然退出程序了!
在配上这幅图,绝壁懂了!
Activity SingleTop 启动模式
步骤:
初始化MainActivity ,启动MainActivity 无任何变化,实例也未改变
初始化MainActivity ,启动BActivity,在启动MainActivity
此时MainActivity 的实例发生变化
得出结论:
SingleTop 模式下,启动的实例如果存在栈顶,ActivityManager并不会新建一个实例,而是选 择复 用原来的实例来保持singleTop中的唯一性,只会去调用onNewIntent方法如何实例不在栈顶,那么会再次创建一个实例,堆栈中会存在两个相同的实例。
此图绝壁懂!
Activity SingleInstance启动模式
这个模式,如图
这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入
使用代码实现
Intent i = new Intent(Intent.ACTION_MAIN)
i.setClassName(activityInfo.applicationInfo.packageName,activityInfo.name)
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(i)
最后,说下在哪里配置启动模式
到此,Activity的四种启动模式就啰嗦完毕,理解四种模式,合理的使用,会使开发事半功倍。如果有帮到你,就多来逛逛。谢谢