activity的四种启动模式分别为
- standard
- singleTop
- singleTask
- singleInstance
首先是standard模式,我们的activity默认就是这种模式,系统不会在乎这个活动是否已经在任务栈中存在,每次启动都会创建该活动的一个新的实例。
使用场景:作为默认的启动模式,standard模式就是简单的创建销毁
如果想要使用其他启动模式,就在AndroidManifest.xml文件内你想要的activity路径下修改launchMode,例:
<activity android:name=".BaseActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
singleTop模式则是在启动活动时观察栈的栈顶是否已经是该活动,如果是,则不再创建实例,就重用该实例( 会调用实例的 onNewIntent() ),不是则重新创建。
应用场景:可以避免短时间快速点击造成活动的大量创建,可以在不需要重复出现的活动中使用
当启动模式指定为 singleTask时,每次启动该活动时系统首先会在任务栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,就重用该实例( 会调用实例的 onNewIntent() ),并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
应用场景:可以在程序的入口点使用,如主界面,返回主界面的同时,就是销毁除了主界面以外所有的活动。
tips: 我们可以设置一个BaseActivity,作为任务栈的栈底,然后设置自己想要的活动作为主界面,使其退出时转到BaseActivity,再退出BaseActivity达到关闭程序的效果,这样可以销毁主界面和BaseActivity之间的活动,如登陆界面等。主要代码如下:
//主界面
Intent intent = new Intent(this,BaseActivity.class);
//传递退出所有Activity的Tag对应的布尔值为true
intent.putExtra(BaseActivity.EXIST, true);
//启动BaseActivity
startActivity(intent);
//BaseActivity
public static final String EXIST = "exist";
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null) {
//判断其他Activity启动本Activity时传递来的intent是否为空
//获取intent中对应Tag的布尔值
boolean isExist = intent.getBooleanExtra(EXIST, false);
//如果为真则退出本Activity
if (isExist) {
this.finish();
}
}
}
singleInstance 模式下会有一个单独的任务栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个任务栈,也就解决了共享活动实例的问题。
- 其中以singleInstance模式启动的Activity具有全局唯一性,即整个系统中只会存在一个这样的实例。
- 以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
- 以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中。
简而言之,就是该模式下启动的活动会在独立的一个栈中,之后在创建这个活动都会复用这个栈中的活动,这个栈中只有这一个活动。
应用场景:如来电提示,闹钟提醒等,可以独立于主程序任务栈的活动。