标准模式是安卓默认启动模式,每一次启动都会创建新的实例压栈,先进后出.谁启动了你,你就会被拉入她所在的栈中那么问题来了,我们的App,第一个Activity,是谁拉你入栈的呢?没错,是ApplicationContext,系统启动你时,默认加了,Intent.FLAG_ACTIVITY_NEW_TASK 标记.
当Activity 启动模式为在XML设置为singleTop时候,假如当前栈是ABCD,D是栈顶复用模式,如果这时候无论谁启动了D,那么栈里面依然是ABCD.如果D是标准模式且是由A或B或C或D启动,那么栈中就是ABCDD.栈顶复用模式D会走newIntent方法不会走oncreate onstart 方法.这种模式主要应用于手抖模式,防止快速点击启动多个Acticity.
深度拓展:
A---->B---->C-->B A启动B,B启动C C启动B 任务栈中应该是这样的:
由于B是栈顶模式,C启动B的时候遍历所有的任务栈顶,查找到了B在任务栈1栈顶中 所以不会创建新的B的实例.
这时候点击回退键:A--->C 退出应用.
A---->B---->C A启动以Intent.FLAG_ACTIVITY_SINGLE_TOP)B,
B启动C C以标准模式启动B 任务栈中应该是这样的:
由于A启动B容易理解,C启动标准模式B并且C是严格单例模式singleInstance,所以会创建新的任务栈将B压栈
点击回退键: B---->A---->C 退出应用
这是一种单实例模式,如果D是栈内复用模式,当页面A启动D时,A会遍历所有任务栈,看看有没有D的实例,如果有就调用D的newIntent方法,如果没有就创建D的实例并且将D带入A所在的栈中.栈内复用模式就是保证所有栈中.只有一个singleTask的实例.在xml中设置singleTask,具有默认FLAG_ACTIVITY_CLEAR_TOP效果.
一般我们app首页MainActivity采用xml中配置singleTask的模式,场景是MainActivity 启动 一个消费数据曲线的页面ConsumActivity,ConsumActivity启动了一个账单页面BillActivity,我们希望点击返回键直接返回到MainActivity
如果没有 xml 中MainActivitysingleTask 也可以在Intent中设置FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(this, MainActivity.class);
startActivity(intent);
当在BillActivity 点击返回的时候我们以清除栈顶的模式启动MainActivity,
MainActivity就会移除和MainActivity同一个栈,栈顶所有Activity实例.
A是标准模式,B是标准模式,C是singleTask模式
A启动B,B启动C
A--->B--->C
B启动C的时候采用清除任务栈的模式
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setClass(this, C.class);
startActivity(intent);
当点击返回键直接退出应用,因为C启动的时候和AB在同一个栈中,并且清除了任务栈中的其他实例.
严格单例单例模式是singleTask栈内复用模式的加强版,只不过单独占了一个任务栈,并且任务栈中只有singleInstance一个实例.
这种模式最好不要用,我们在示例1和示例2中看出,他会给你的回退键,退出应用造成很大困扰.
因为它的回退,是等所有非singleInstance模式栈都回退以后,它才退出.与我们的交互习惯是不符合的.
如有疑问欢迎在下方评论留言,我会尽快回复.