一直想写一篇activity的四种启动模式的文章,闲来整理了一下;
一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。
Activity一共有以下四种launchMode:
1.standard(standard是系统默认的启动模式)
2.singleTop
3.singleTask
4.singleInstance
我们可以在<activity android:name=".MainActivity" android:launchMode="standard">里设置lannchMode
一、standard
由于standard是系统默认的launchMode,我们可以不用设置,当然,为了方便区分,也可以设置为standard。创建一个类来演示
public class MainActivity extends AppCompatActivity {
private Button first_btn;
private TextView first_tv;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
first_btn= (Button) findViewById(R.id.first_btn);
first_tv= (TextView) findViewById(R.id.first_tv);
first_tv.setText(this.toString());
first_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
intent=new Intent(MainActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
}
我们注意到有一个Textview,这是用来显示当前activity实例的序列号,Button按钮用来跳转到下一个activity
默认进入时会看到:
点击按钮后:
再次点击:
我们不难发现,每张图片的序列号都不一样,说明每次点击都产生了一个新的activity实例,
并且放于栈结构的顶部,当我们按下后退键时,才能看到原来的Activity实例。
这就是standard启动模式,不管有没有已存在的实例,都生成新的实例。
二、singleTop
这里就不再上图片了,直接用语言描述
①在同一个activity跳转,序列号是不变的,
也就是说使用的都是同一个Activity实例;如果按一下后退键,程序立即退出,说明当前栈结构中只有一个Activity实例
②在不同的activity跳转
从第一个activity跳到第二个,序列号发生变化,产生了新的实例,再从第二个activity跳到第一个,我们发现,序列号还是发生了变化,
这是因为系统发现栈内有一个firstActivity的实例,但是不是位于栈的最顶层,所以重新生成一个firstActivity的实例。
如果发现有一个相同的实例位于栈的最顶层,则会重复利用,不会产生新的实例
三、singleTask
从第一个activity跳到第二个,序列号发生变化,产生新的实例,
再从第二个activity跳回去第一个,你会发现第一个activity的序列号没有发生变化,说明没有产生第一个activity的实例,
在这个跳转过程中系统发现有存在的FirstActivity实例,于是不再生成新的实例,而是将FirstActivity之上的Activity实例统统出栈,
将FirstActivity变为栈顶对象显示出来
在以上基础上再跳回第二个activity,第二个activity的序列号又发生了变化,说明产生新的实例。
四、singleInstance
这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。
我们修改FirstActivity的launchMode="standard",SecondActivity的launchMode="singleInstance",由于涉及到了多个栈结构,
我们需要在每个Activity中显示当前栈结构的id,所以我们为每个Activity添加如下代码:
1. TextView taskIdView = (TextView) findViewById(R.id.taskIdView);
2. taskIdView.setText("current task id: " + this.getTaskId());
当我们点击跳转时,我们发现这两个Activity实例分别被放置在不同的栈结构中
我们看到从FirstActivity跳转到SecondActivity时,重新启用了一个新的栈结构,来放置SecondActivity实例,
然后按下后退键,再次回到原始栈结构;当SecondActivity中再次跳转到FirstActivity,这个时候系统会在原始栈结构中生成一个FirstActivity实例,
然后回退两次,注意,并没有退出,而是回到了SecondActivity,为什么呢?
是因为从SecondActivity跳转到FirstActivity的时候,我们的起点变成了SecondActivity实例所在的栈结构,这样一来,我们需要“回归”到这个栈结构。
PS:如果有不足之处,欢迎留言