1. standard
不同的Activity在同一个栈中,
每次创建新实例的时候,新实例便会堆放到栈顶。
当点返回键的时候,便会从栈顶按顺序将实例移除栈。直至栈为空则退回到桌面。
2. singleTop
不同的Activity在同一个栈中。
① 如果此时Aty1的实例在栈顶,此时再创建一个新的Aty1并不会成功。
② 如果Aty_1不在栈顶,此时再创建一个Aty1的实例,会产生一个新的Aty1实例到栈顶。
当点返回键的时候,便会从栈顶按顺序将实例移除栈。直至栈为空则退回到桌面。
3. singleTask
不同的Activity在同一个栈中。
① 如果此时Aty1的实例在栈顶,此时再创建一个新的Aty1并不会成功。
② 如果Aty_1不在栈顶,此时再创建一个Aty1的实例,页面会返回到任务栈中存在的Aty1的实例,并将Aty1上面所有的实例移出栈。
当点返回键的时候,便会从栈顶按顺序将实例移除栈。直至栈为空则退回到桌面。
4. singleInstance
不同的Activity 处于不同栈中
① 如果此时Aty1的实例在栈顶,此时再创建一个新的Aty1并不会成功。
② 如果此时Aty2的实例还未被创建,则创建的Aty2的实例时会存放到一个新的任务栈中。
③ 如果此时Aty1的实例已存在且我们在Aty2的页面中创建新的Aty1实例时,则不会创建新的Aty1实例,而是页面跳转到原来任务栈中存在的Aty1的实例,但存放Aty2实例的任务栈仍然存在
当点返回键的时候,便会依次销毁相应的任务栈,直至任务栈数为空则退回到系统桌面。
例如:现有2个项目,taskA、taskB。taskA负责调用taskB中指定的界面。
taskB中有3个界面,a、b、c,每个界面显示它所在的task id。
SingleTask:
其中b界面被声明为SingleTask。
先运行taskB,显示a界面,由a界面调用b界面,这时b界面的taskid与a界面的taskid是一致的,说明b界面与a界面在同一个task中;由b界面调用c界面时,c界面的taskid与a和b界面的taskid一致,说明这三个界面是在同一个task中。当前显示的是c界面,此时按Home键回到桌面,运行taskA的界面调用taskB的b界面,这时b界面显示出来,它的taskid没有变,还是之前的taskid,只不过之前显示的是c界面,这时c界面已经不知所踪,这时再按back键,则回到了a界面,然后是taskA的界面。
这说明,SingleTask所标注的Activity在被自身的app调用时,是不新建task的,同时,如果系统中存在了这个SingleTask界面的实例时,会将其所在的task切换到前台,并把SingleTask界面之后开启的其他界面全部关闭(有待考证是否关闭)。
另外有一种情况,例如:a界面被调用,这时按Home键返回到桌面,启动taskA,并调用b界面,这时b界面的taskid与a界面的一致,说明b界面与a界面同属于一个task。如果直接运行taskA调用b界面,b的taskid与taskA的界面的taskid不同,说明在新task中实例化了b界面,由b界面调用c界面,c界面的taskid与b界面一致,说明b与c同属于一个task。
SingleInstance:
将b界面声明为SingleInstance。
先运行taskB,显示a界面,由a界面调用b界面,这时b界面的taskid与a界面的taskid不同,说明b界面是在新task中生成的实例;由b界面调用c界面,c界面的taskid与a界面的taskid相同,说明a、c界面同属于一个task。