Android Activity四种启动模式

在讲启动模式之前我先科普下,在AndroidManifest.xml 中配置Activity的启动模式,和Intent 设置启动模式的区别,在xml中设置启动模式,在Intent 中设置启动模式,只对本次启动页面有效,或者说只对这个Activity实例有效,后者优先级高于前者.

 

1.standard 标准模式 

标准模式是安卓默认启动模式,每一次启动都会创建新的实例压栈,先进后出.谁启动了你,你就会被拉入她所在的栈中那么问题来了,我们的App,第一个Activity,是谁拉你入栈的呢?没错,是ApplicationContext,系统启动你时,默认加了,Intent.FLAG_ACTIVITY_NEW_TASK 标记.

2.singleTop (FLAG_ACTIVITY_SINGLE_TOP) 栈顶复用模式

当Activity 启动模式为在XML设置为singleTop时候,假如当前栈是ABCD,D是栈顶复用模式,如果这时候无论谁启动了D,那么栈里面依然是ABCD.如果D是标准模式且是由A或B或C或D启动,那么栈中就是ABCDD.栈顶复用模式D会走newIntent方法不会走oncreate onstart 方法.这种模式主要应用于手抖模式,防止快速点击启动多个Acticity.

深度拓展:

示例1:A在XML配置为标准模式 B在XML配置为栈顶复用模式 C在XML中配置为单实例模式

A---->B---->C-->B   A启动B,B启动C  C启动B  任务栈中应该是这样的:

Android Activity四种启动模式_第1张图片

由于B是栈顶模式,C启动B的时候遍历所有的任务栈顶,查找到了B在任务栈1栈顶中 所以不会创建新的B的实例.

这时候点击回退键:A--->C 退出应用.

 

示例2:A在XML配置为标准模式 B在XML配置为标准模式 C在XML中配置为单实例模式

A---->B---->C   A启动以Intent.FLAG_ACTIVITY_SINGLE_TOP)B,

B启动C  C以标准模式启动B  任务栈中应该是这样的:

Android Activity四种启动模式_第2张图片

由于A启动B容易理解,C启动标准模式B并且C是严格单例模式singleInstance,所以会创建新的任务栈将B压栈

点击回退键:   B---->A---->C 退出应用

 

结论:可以认为任务栈本身 是处于类栈的内存中,区别是当回退时遇到singleInstance 的任务栈时,跳过当前栈,向前继续出栈,当到第一个栈时,反向从最后一个任务栈轮询出栈,当singleInstance第二次轮询到的时候,出栈.换句话说singleInstance任务栈总是等其他栈都出栈以后,再出栈.

 

 

3.singleTask (FLAG_ACTIVITY_NEW_TASK)栈内复用模式

这是一种单实例模式,如果D是栈内复用模式,当页面A启动D时,A会遍历所有任务栈,看看有没有D的实例,如果有就调用D的newIntent方法,如果没有就创建D的实例并且将D带入A所在的栈中.栈内复用模式就是保证所有栈中.只有一个singleTask的实例.在xml中设置singleTask,具有默认FLAG_ACTIVITY_CLEAR_TOP效果.

 

示例3 FLAG_ACTIVITY_NEW_TASK和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);

Android Activity四种启动模式_第3张图片

当在BillActivity 点击返回的时候我们以清除栈顶的模式启动MainActivity,

MainActivity就会移除和MainActivity同一个栈,栈顶所有Activity实例.

 

实例4 和FLAG_ACTIVITY_CLEAR_TASK配合使用:

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在同一个栈中,并且清除了任务栈中的其他实例.

 

4.singleInstance 单实例模式

严格单例单例模式是singleTask栈内复用模式的加强版,只不过单独占了一个任务栈,并且任务栈中只有singleInstance一个实例.

这种模式最好不要用,我们在示例1和示例2中看出,他会给你的回退键,退出应用造成很大困扰.

因为它的回退,是等所有非singleInstance模式栈都回退以后,它才退出.与我们的交互习惯是不符合的.

 

总结:

1.在xml中配置Activity启动模式优先级低于在 Intent代码中设置启动模式

2.singleInstance无法在Intent代码中设置启动模式

3.FLAG_ACTIVITY_CLEAR_TOP 和FLAG_ACTIVITY_CLEAR_TASK无法在xml中设置

如有疑问欢迎在下方评论留言,我会尽快回复.

 

 

 

你可能感兴趣的:(android)