启动模式
顾名思义就是activity启动时的执行策略,一共有四种,分别是standard、singleTop、singleTask、singleInstance。
启动模式的设置在AndroidManifest.xml中修改,默认是standard模式,如果需要修改的话要在<activity >中使用 android:launchMode="" 选择启动模式,例子:
<activity
android:name=".SecondActivity"
android:launchMode="singleTop" />
<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>
(1)standard
默认的启动模式,也是最容易理解的启动模式,Activity按照打开顺序一个接一个存入任务栈中,即使打开的是完全相同的Activity(即在目前的Activity再次打开这个Activity)也是新建一个Activity放于栈顶,即原先的Activity的上面。
为了更直观地看到结果,下面用三个Activity演示一下:
先新建三个跳转按钮,分别设置点击跳转逻辑:
public void toSecondActivity(View view) {
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
public void toThirdActivity(View view) {
startActivity(new Intent(MainActivity.this, ThirdActivity.class));
}
public void toMyself(View view) {
startActivity(new Intent(this,getClass()));
}
界面大概如下:
模拟A-B-C-A-A-B-B-C-C-C-A,随后一直按返回键,可以看到每次跳转都会新建一个Activity,而back之后会销毁并将下方的Activity置于栈顶。
singleTop
顾名思义,singleTop就是处于栈顶的Activity不会重复,栈顶的Activity启动相同Activity时会调用onNewIntent来复用该Activity,流程是startActivity - onPause - onNewIntent - onResume。
而启动其他不同Activity则如standard模式一样,将新建Activity置于栈顶,后续即使遇到重复的启动过的Activity只要与栈顶Activity不同也是直接新建一个Activity。
singleTask
顾名思义,就是栈内的Activity不会重复,即相同Activity只可能有一个在栈中。当启动一个栈内不存在的Activity时会create一个新Activity,但若是栈内已有相同Activity则会调用onNewIntent将处于栈中的Activity调到栈顶,而原本处于该Activity上方的Activity会全部被destroy,也即被踢出栈。
这里将ThridActivity改为standard模式,随后测试发现singleTask模式下启动已有Activity会先destroy栈顶到即将执行onNewIntent的Activity之间的Activity,随后即将启动的Activity进行onNewIntent后再destroy原先位于栈顶的Activity。
点击顺序为:A-B-C-C-B-C-A-back
singleInstance
singleInstance模式下每个栈内都只能有一个Activity,未启动过的Activity在新建时都会存放于一个新的栈中,每次启动已启动过的Activity则会调用onNewIntent复用原先的Activity。
在这种模式下,整个系统都只可能有这一个Activity实例。