本篇文章主要讲解活动的生命周期和活动的启动模式。
一、活动的启动模式
活动的启动模式共有4种,分别是standard、singleTop、singleTask和singleInstance;
可在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。
1、standard
此模式是活动的默认启动模式,在此模式下,每启动一个新活动,它就会入栈,并处于栈顶位置,对于此模式的活动,系统不会在乎这个活动是否在返回栈中存在,每次启动都会创建该活动的实例。
下面尝试实验。
java类:
添加如下代码,点击按钮会再次显式跳转到当前活动,主要演示standard模式下的活动。点击三次按钮,需要点击三次返回才能退出程序,这是因为创建了三个活动实例,返回栈中也存在三个此活动实例。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_csdn3);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(csdn3.this,csdn3.class);
startActivity(intent);
}
});
}
2、singleTop
本模式下,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。singleTop模式可以很好的解决重复创建栈顶活动问题
与上一模式的不同是,点击多次按钮跳转活动后,只需点击一次返回键即可退出程序,但是只是启动栈顶活动时会这样,启动非栈顶活动,还是会创建新的活动实例。
3、singleTask
singleTop存在的问题是:如果活动处于非栈顶位置,还是会创建多个活动实例,而singleTask模式可以让活动在整个应用程序的上下文中只存在一个实例。在此模式下,每次启动该活动时系统首先会在返回栈中检查是否存在该活动实例,如果已存在则直接使用该实例,并把此活动之上的所有活动出栈;如果不存在则创建一个新的活动实例。
下面演示一下:从csdn2和csdn3活动间跳转。
修改AndroidManifest.XML中的启动模式:
android:launchMode="singleTask"
部分代码如下:
<activity
android:name=".csdn2"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".csdn3"/>
csdn2类:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_csdn2);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(csdn2.this,csdn3.class);
startActivity(intent);
}
});
}
csdn3类:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_csdn3);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(csdn3.this,csdn2.class);
startActivity(intent);
}
});
}
效果如下 :
如果是默认模式,点击跳转csdn3后,在点击跳转csdn2,需要点击三次返回键可退出程序;
而singleTask模式下,跳转若干次后,只需点击一个返回键即可退出程序。
4、singleInstance
此模式比较复杂,假想以下场景:有一个活动允许其他程序调用,如果想实现其他程序和我们程序共享这个活动实例,如何实现?singleInstance模式可解决此问题,此模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序,公用一个返回栈。