Android活动的启动模式

启动模式

在AndroidManifest.xml文件中给<activity>标签指定 android:launchMode 属性来设置启动模式

  • standard
  • singleTop
  • singleTask
  • singleIntance
standard
  • 默认的启动模式
  • 每启动一个新的活动,他就会从返回栈中入栈,并处于栈顶的位置
  • 对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈汇总存在,每次启动都会创建该活动的一个新的实例
standard demo:

我们在FirstActivity的基础上再启动FirstActivity,并两次点击按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);

Log.d(TAG, this.toString());

Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, FirstActivity.class); //启动自身
startActivity(intent);
}
});
}

发现需要点三次BACK才能返回桌面

singleTop

当启动活动时发现返回栈的栈顶已经是该活动,则直接使用,不再创建新的活动。

还是上面的例子,这次将活动的启动模式设置为singleTop

1
2
3
4
5
6
7
8
<activity 
android:launchMode="singleTop" 设置为singleTop模式
android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

连续点击3次会发现只打印了1次

不过当Activity并未处于栈顶位置时,这时再启动Activity,还是会创建新的实例

singleTask

让某个活动在整个应用程序的上下文中只存在一个实例,每次启动该活动时,系统首先会在返回栈中检查是否存在该活动的实例,若发现已经存在,则直接使用该实例,并把该活动之上的所有活动统统出站,若没有发现,则会创建一个新的实例

  • 下面将Activity1的启动模式设为singleTask,并在Activity1中复写onRestart()方法,在Activity2中复写onDestroy()方法,从Activity1跳转到Activity2并返回Activity1,观察log输出
1
2
3
4
5
6
7
8
<activity
android:launchMode="singleTask" 设置为singleTask
android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

会发现,一开始创建了一个MainActivity的实例,跳转到活动2并返回后,发现调用了Activity1的restart,和Activity2的onDestroy方法

singleInstance

指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动

  • 做一个简单demo,将Activity2的启动模式设置为singleInstance,activity1和Activity3为默认的启动模式,在每个活动中都用getTaskId()获取并打印出自己所在的返回栈的ID,首先启动Activity1,然后从Activity1跳转到Activity2,再从Activity2跳转到Activity3,再点击返回键BACK,观察log输出

通过日志可以发现,Activity2的确用了一个新的返回栈来处理,Activity1和Activity3的返回栈id是一样的,说明是同一个返回栈,并且在Activity3点击BACK返回时,会发现到了Activity1,在Activity1中点击返回,到了Activity2页面。也就是说,只有一个返回栈空了,才会转到另外一个栈

0%