Activity的启动模式

在实际的项目中,对于不同的Activity我们可以根据它的特点来选择恰当的启动模式。一共有四种,分别为

  • standard
  • singleTop
  • singleTask
  • singleInstance

启动模式的设定可以在AndroidManifest.xml中通过给标签来指定 android:launchMode属性来选择。
接下来就让我们一个个来认识这些启动模式。

standard

作为Activity的默认启动模式,在不进行显示指定的情况下,所有的活动都会自动使用这种模式。在这个模式下,我们每当启动一个新的Activity都会创建一个对应的实例,然后在返回栈中入栈,并处于栈顶的位置。系统不会去检查这个活动是否已经在返回栈中存在。
举个例子。我们有ActivityA。用
Intent intent = new Intent(ActivityA.this,ActivityA.class);
startActivity(intent);
启动三次,那么此时我们的返回栈就拥有三个FirstActivity的实例,如ActivityA-ActivityA-ActivityA,要按三次back键才能退出程序。
用standard的好处是简单,易懂。创建一个放一个在栈顶。
但缺点就是太费资源了,而且有可能会出现退多次才能退干净的问题。

singleTop

在standard的基础上,它加入了检查栈顶是否是要我们要的Activity的操作,如果栈顶已经是我们要创建的Activity的话,那么它将不会再创建新的实例,转而直接使用栈顶Activity.
就上面standard的例子来说,此时我们的返回栈只会出现一个ActivityA而已。按一次back键就可以退出程序。

singleTask

使用singleTop可以很好地解决重复创建栈顶活动的问题。但是如果你的活动没有处于栈顶的位置的话,那恭喜你,还是会创建多个活动的实例的。那么如果想让某个法在整个应用程序的上下文中只存在一个实例的话,要怎么办呢。这就要用到singleTask。每次启动该Activity的时候系统首先会在返回栈中检查是否存在该活动的实例,看清楚了,不止检查栈顶哦!如果没有就直接创建一个,而如果发现已经存在则直接使用该实例,并把这个活动之上的所以活动统统出栈。
举个例子。我们拥有ActivityA,ActivityB。而ActivityA是singleTask。
当我们先创建一个ActivityA后接着创建一个ActivityB的话,此时我们的返回栈中就会依次放着
ActivityA-ActivityB。如果此时我们要启动一个ActivityA的操作,那么系统就会检测到我们之前已经创建一个ActivityA,所以它将不再创建一个ActivityA实例,而是将ActivityA提到栈顶,并且将ActivityB退出。

singleInstance

上述的三种启动模式都是程序的同一个task来进行操作的,也就是在同一个返回栈中来操作的。但singleInstance则是通过启动一个新的返回栈来管理这个活动的。
举个例子。
如果你有ActivityA,ActivityB,还有ActivityC。而其中ActivityB的启动模式是singleInstance。
我们先创建一个ActivityA,再创建一个ActivityB,而后再创建一个ActivityC。当我们依次退出这些Activity的时候,会依次地退出ActvityC,ActivityA,ActivityB。为什么会出现这样的问题呢?
其实在这个流程中,我们创建ActvityB的时候,会多创建一个返回栈并把ActivityB单独放在那里。等放入ActivityC时还是放回程序原先的返回栈中。
现在就变成了我们拥有两个返回栈。
栈A:ActivityA-ActivityC
栈B:ActivityB
所以当我们退出的时候首先是从ActivityC开始退出,再退出ActivityA。等栈A退完,再退栈B的ActivityB
这样的启动模式到底有什么应用场景呢?
答:解决共享活动实例的问题。因为在每一个程序里面都拥有各自的返回栈,而我们可以通过把要共享的Activity单独开辟一个返回栈存储来允许其他程序来调用。这样,如果其他程序想要用的时候可以直接过来取。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值