.有哪几种启动模式?
1.standard(标准启动模式--默认的启动模式)
当通过这种模式来启动Activity时, Android总会为目标 Activity创建一个新的实例,并将该Activity添加到当前Task栈中。这种方式不会启动新的任务栈,只是将新的 Activity添加到原有的任务栈中。
例如:栈内:A→B→C 再启动一个C,再启动一个B,栈内:A→B→C→C→B
2.singleTop(栈顶复用模式)
当通过这种模式来启动Activity时,基本和standard一致,但是当将要被启动的Activity已经位于任务栈栈顶时,系统不会重新创建目标Activity实例,而是直接复用Task栈顶的Activity。
例如:栈内:A→B→C 再启动一个C,再启动一个B,栈内:A→B→C→B
- singleTask(栈内复用模式)
当通过这种模式来启动Activity时,Activity在同一个Task内只有一个实例。 如果将要启动的Activity不存在,那么系统将会创建该实例,并将其加入Task栈顶;如果将要启动的Activity已存在,且存在栈顶,直接复用Task栈顶的Activity。
如果Activity存在但是没有位于栈顶,那么此时系统会把位于该Activity上面的所有其他Activity全部移出Task,从而使得该目标Activity位于栈顶。
例如:栈内:A→B→C 再启动一个C,再启动一个B,栈内加入C后:A→B→C 栈内加入B后:A→B - singleInstance(单例模式)
当通过这种模式来启动Activity时,无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例且会用一个全新的Task栈来装载该Activity实例(全局单例)
如果将要启动的Activity不存在,那么系统将会先创建一个全新的Task,再创建目标Activity实例并将该Activity实例放入此全新的Task中。
如果将要启动的Activity已存在,那么无论它位于哪个应用程序,哪个Task中;系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来。
例如:栈内:A→B→C 再启动一个C,再启动一个B,
栈内加入C后,栈1:A→B 栈2:C 当前栈2在前台
栈内加入B后:栈1:A 栈2:C 栈3:B 当前栈3在前台
.怎么设置启动模式
1.使用 manifest 文件(AndroidMainifest.xml)
<activity
android:name=".MainActivity"
android:launchMode="singleTask"/>
设置launchMode属性
2.使用 Intent 标志
Intent intent = new Intent(this,NewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
四种模式下怎么设置Flags?
FLAG_ACTIVITY_NEW_TASK =singleTask
FLAG_ACTIVITY_SINGLE_TOP=singleTop
FLAG_ACTIVITY_CLEAR_TOP ≈singleTask缩减版(要启动的 activity 已经在当前 task 中运行,则不再启动一个新的实例,且所有在其上面的 activity 将被销毁。)
其他FLAG请参考https://blog.csdn.net/new_abc/article/details/13627853(作者不要打我,谢谢)
.如何使用启动模式
直接使用 manifest 文件
一般情况下都不用设置启动模式,也就是使用的standard启动模式啦
singTop:比如你在一个展示推送消息的列表页,这个时候又来了一条推送消息,用户点击这条推送消息的事件是跳转到这个推送消息列表页,用户点返回应该是返回之前的页面,而不是又一个消息列表页,这个时候就可以用这个启动模式啦!
singleTask:比如不需要登录的主界面啦,当你在主界面上做一些需要登录的操作时,这个时候又需要跳转去登录页,登录完成后需要回到主页,但是在主页按返回键不应该去登录或者其他页面,这个时候,就用这个启动模式
singleInstance:据说一般用于系统页面,比如你从任意一个应用都可以启动的拨打电话界面,不管你从哪里启动,永远都只有一个拨号页
退出登录回到登录页:
Intent intent = LoginActivity.getStartIntent(this);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
PS:使用 Intent 标志>使用 manifest 文件