Android的启动模式一共有4种,分别是:
- standard 默认
- singleTop 栈顶唯一
- singleTask 栈内唯一
- singleInstance 实例唯一
启动模式可以在AndroidManifest.xml文件中< activity >标签下配置
android:launchMode,如下代码所示:
<activity android:name=".MainActivity"
android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
还可以在启动一个Activity的时候,设置一个启动标识,代码如下:
Intent i = new Intent(MainActivity.this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
说完怎么设置launchMode,再来说下这4个启动模式分别有什么作用:
-
standard
standard是默认的启动模式,比如不在AndroidManifest.xml文件< activity >标签下配置launchMode,那么默认就是这种启动模式,默认的启动模式会将启动的Activity依次入栈,按back键,后进先出的出栈,我们通过一个例子实际看下,在布局文件中有一个button,然后为这个按钮设置点击事件,点击的时候以standard启动模式启动自己
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this, MainActivity.class);
startActivity(i);
}
});
连续点击5次按钮,在adb shell中查看Activity栈,dumpsys activity 可以找到对应我们的包名的Activity栈可以看到:
栈里面有6个MainActivity,启动时的一个,按5次按钮时启动了5个MainActivity,可以得出和刚才一样的结论:
默认的启动模式会将启动的Activity依次入栈,按back键,后进先出的出栈
-
singleTop
singleTop 栈顶唯一,当配置launchMode="singleTop"时
1.启动模式是singleTop的Activity为栈顶时,再去启动这个Activity,并不会产生新的Activity入栈,而是复用栈顶Activity
2.启动模式是SingleTop的Actiyity不为栈顶时,再去启动这个Activity,会产生新的Activity入栈
<activity android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
将MainActivity的launchMode属性配置为singleTop,布局文件还是一个按钮,当点击按钮时启动自己,这时点击5次按钮,观察Activity栈如下:
可以看到栈中还是一个MainActivity,当前Activity也是栈顶。这里可能有疑问的是:当反复启动栈顶Activity时生命周期方法会重新调用吗?答案是onResume和onPause方法会成对调用,其它生命周期不会调用,有兴趣的同学可以试下。
现在看第二种情况,当MainActivity不是栈顶Activity时,再去启动MainActivity时,Activity栈会是什么情况了?如下图
可以看到当配置了singleTop属性的MainActivity不是栈顶的时候,再去启动MainActivity会创建新的Activity入栈。
-
singleTask
singleTask 是栈内唯一,和singleTop不同的时,当配置了singleTask的Activity不在栈顶时也会复用,如果不在栈顶,会强制其它Activity出栈,只到它位于栈顶
当多次启动singleTask的Activity可见栈中还是一个Activity -
singleInstance
singleInstance模式是实例唯一,以这种模式启动的Activity会新建一个Activity栈,单独入栈这个Activity
以launchMode=singleInstance启动TwoActivity,如下
可以看到启动TwoActivity时,是新建了一个Activity栈来存放TwoActivity的。
到这里4种启动模式就说完了,有兴趣的同学可以通过配置不同的launchMode属性来观察Activity栈的情况,深入分析下。