Activity有四种启动模式:
1.standard:标准模式,
该模式的Activity每次启动时都会创建实例,也就是说每次启动都会在任务栈中对该Activity的实例进行入栈操作。
以一个实例进行说明:手机当前显示的Activity为A,在A上有一个Button,点击该Button会跳转到A,点击两次Button,它的入栈过程如下
我们怎么知道栈中有三个Activity A呢,点击手机上的返回键,点击返回键返回到我们手机的主界面所需要的次数,就是栈中A的个数。
点击屏幕的返回键三次,才返回到主界面,说明栈中有三个Activity A的实例
注意:对于standard启动模式的Activity A,如果是B启动它,那么A就在B的任务栈中入栈,即启动者和被启动者在同一个任务栈中。假如我们通过如下的方式启动A:
getApplicationContext().startActivity(intent);
会出现如下的错误提示
原因在于全局的Context没有所谓的任务栈,所以A无法入栈,进入到启动它的Activity的任务栈中。
解决办法:在启动前加上
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
2.singleTop模式:
该模式也称为栈顶复用模式,也就是说singleTop模式的Activity如果此时处于栈顶,我们在启动它,系统是不会创建它的实例的,反之,如果它不处于栈顶,那么系统又会创建它的实例。
举个例子:假如现在任务栈中的情况是AB,B在栈顶,我们有启动B,由于B是singleTop的启动模式,所以启动之后任务栈中的情况还是AB,即没有重新创建B的实例,如果是standard模式,任务栈中的情况是ABB,如果B不在栈顶,假设任务栈中的情况是ABC,现在由C启动B,那么任务栈中的情况是ABCB,因C启动B的时候,B不在栈顶
3.singleTask模式:
该模式也成为栈内复用模式,
有三个Activity A,B,C其中B的启动模式是singleTask模式,A,C为standard模式,这里要分两种情况:
1,B所需要的任务栈和A,C相同(默认情况下同一个应用程序的Activity所需要的任务栈都是相同的),假设现在任务栈中的情况是ABC,C在栈顶,由C启动B,由于B在任务栈中已经存在,所以系统会将C出栈,让B处于栈顶,不用重复创建B的实例了,此时栈中的情况是AB.
2, B所需的任务栈和A,C不同(有taskAffinity属性指定),栈S1中是AC,此时由C启动B,由于B所需的任务栈没有,所以下系统会为B创建一个任务栈S2,并将B的实例入栈,所以栈S1内的情况是AC,栈S2内的情况是B
4.singleInstance模式:
改模式包含了singleTask模式的所有特性,只是这种模式的Activity在创建的时候只能单独位于一个任务栈中