Activity的四种启动模式

standard

这是一种标准模式,也是系统默认的Activity启动模式。每当启动一个Activity时,不管之前这个实例是否已经存在,都会重新创建一个新的实例。这是一种典型的多实例实现,一个任务栈中可以有多个该实例,每个实例也可以属于不同的任务栈。在这种模式下,谁启动了这个Activity,那么这个Activity就会运行在启动它的那个Activity所在的栈中。比如现在有一个Activity A 和一个Activity B(B是standard启动模式),Activity A 可以启动Activity B,那么B在启动的时候就会进入A所在的栈中。

singleTop

这是一种栈顶复用模式。在该模式下,如果新的Activity已经位于任务栈的栈顶,那么该Activity不会被重新创建,同时它的onNewIntent 方法会被回调,通过此方法的参数我们可以取出当前请求的信息。同时该Activity的onCreate、onStart不会被系统调用,因为它并没有发生改变。但是如果新Activity的实例已经存在,只是不位于栈顶,那么新Activity仍然会重新创建。比如现在有一个Activity A 和一个Activity B(B是singleTop启动模式),假如当前任务栈中从栈底到栈顶依次为AB的话,此时启动B,那么栈内情况仍为AB,但是如果当前任务栈中从栈底到栈顶依次为ABA的话,再启动B,那么栈内情况即为ABAB。

singleTask

这是一种栈内复用模式。在这种模式下,只要Activity在一个栈中存在,那么多次启动该Activity都不会重新创建实例,和singleTop一样,系统也会回调其onNewIntent。具体点说,当一个singleTask模式的Activity A请求启动时,如果任务栈中没有A的实例,那么就会新建A的实例并把A压入栈中;如果任务栈中已经有A的实例了,那么就会将A以上的Activity全部出栈,从而使A的实例位于栈顶。比如想要请求启动一个singleTask模式的Activity C的话:

  • 如果当前仅有任务栈S1,并且从栈底到栈顶依次为AB,Activity C所需任务栈为S2,那么系统会先创建任务栈S2,然后将C压入栈到S2
  • 如果当前仅有任务栈S1,并且从栈底到栈顶依次为AB,Activity C所需任务栈为S1,那么系统会将C压入栈到S1,S1此时从栈底到栈顶依次为ABC
  • 如果当前仅有任务栈S1,并且从栈底到栈顶依次为ACB,Activity C所需任务栈为S1,那么系统会将B出栈,此时从栈底到栈顶依次为AC

 singleInstance

这是一种单实例模式。它除了具有singleTask模式的所有特性外,还加强了一点,那就是具有此种模式的Activity只能单独地位于一个任务栈中。换言之,比如Activity A 是singleInstance启动模式,当A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了。

如何指定Activity的启动模式

1.通过在AndroidManifest中设置Activity的launchMode属性来指定Activity的启动模式

<activity
    android:name=".SecondActivity"
    android:label="@string/second_activity_name" 
    android:launchMode="singleTask"/>

2.通过在Intent中设置标志位来指定Activity的启动模式

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

虽然上面两种方式都可以给Activity设置启动模式,但是还是有所区别的:

  • 从优先级来看,第二种的优先级较高,当两种方式同时存在时,以第二种方式为准
  • 上述两种方式在限定范围上有所不同,比如第一种方式无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法为Activity指定singleInstance模式

关于标志位的一点补充

翻译为标志位,原文是flag,也就是intent.addFlags()方法所接收的参数。标志位的作用有很多,有的标志位可以设定Activity的启动模式,就像上述的第二种指定方式;有的标志位可以影响Activity的运行状态。

  • FLAG_ACTIVITY_NEW_TASK:为Activity指定为“singleTask”启动模式
  • FLAG_ACTIVITY_SINGLE_TOP:为Activity指定为“singleTop”启动模式
  • FLAG_ACTIVITY_CLEAR_TOP:具有此标志位的Activity,当它启动时,在同一个任务栈中的所有位于它上面的Activity都要出栈,如果该Activity的启动模式是singleTask,那么系统会调用它的onNewIntent方法,如果该Activity的启动模式是standard,那么它也会出栈,然后系统会创建新的Activity压入栈
  • FLAG_ACTIVITY_EXECLUDE_FROM_RECENTS:具有此标志位的Activity,不会出现在历史Activity的列表中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值