彻底分清Activity的启动模式,明白什么情况下应该使用哪种模式

Activity的四种启动模式

Activity一共有四种启动模式,分别为standard、singleTop、singleTask、singleInstance。

这四种模式我们可以在AndroidManifest.xml清单文件的<Activity节点下通过android:launchMode来进行配置

Activity的任务栈

分析启动模式之前,需要清楚Activity的任务栈是什么意思。栈可以看成是一个队列,采用的是先入后出的原则,简单的可以把栈想象成一个可以压入子弹弹夹,每个任务栈相当于是一个弹夹,不同的任务栈也就是不同的弹夹,而任务栈中Activity就是弹夹里面的子弹,虽然Activity的任务栈中的Activity会因为有些启动模式可以从下面直接到上面,但完全可以这样简单粗暴的理解,任务栈是弹夹,Activity是弹夹中的子弹,当前活跃的那个Activity就好比弹夹中最上面的子弹。

四种启动模式的分析

一、standard模式

standard是默认的一种模式,当我们新创建一个应用或新声明一个Activity时,会发现其实并没有android:launchMode这个配置,此时这个Activity的启动模式就是standard,默认不配置跟android:launchMode="standard"效果一样。

这种模式下,启动它的activity所属的是哪个任务栈,它启动后就会默认进入哪个站,而且不管这个任务栈中之前有没有相同activity的实例,都会创建一个新的实例并压入栈中。activity它的onCreate(),onStart(),onResume()方法都会被调用。 

二、singleTop模式

singleTop是栈顶复用模式。启动singleTop模式的activity分为两种情况:

1.启动的activity不在栈顶时:和standard模式一致,不管栈中有没有相同activity的实例,都会创建都会创建一个新的实例并压入栈中,正常走生命周期的方法。

2.启动的activity在栈顶时:如果当前任务栈的栈顶为启动的activity,那么不会创建一个新的实例,跟singleTop模式的名字一样,会复用栈顶的实例,并且不会调用onCreate()和onStart(),而是会将Intent对象传入,调用onNewIntent()方法,之后调用onResume()方法。

三、singleTask模式

singleTask是栈内复用模式。如singleTop栈顶复用模式一样,singleTop是只有在新启动的实例在栈顶的时会复用,singleTask就是,只要新activity在所需要的任务栈中存在,不管它在栈中的什么位置,那么多次启动此activity都不会被重新创建单例,系统会回调onNewIntent()。

这种模式可以也称为单例模式,在所需要的任务栈中只会存在一个,栈中有则直接从栈中调用,栈中没有则新创建并且压入栈中。

但有几个情况需要特别注意,如果所需要的任务栈中存在这个Activity的实例,但此Activity并不位于栈顶,在复用时,并不是将此Activity直接移动到栈顶,而且将此Activity上面的Activity全部移出栈,从而达到这个Activity位于栈顶的目的。

而且singleTask模式的Activity启动时,还存在一个任务栈的匹配的过程,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。

四、singleInstance模式

singleInstance是单实例模式,具有全局唯一性。这种模式的activity只能单独地位于一个任务栈中,与singleTask有点类似,其实也是栈中有则直接复用,没有则创建并且放入栈中,只不过singleTask是可以和其他的Activity放在同一个栈中,singleInstance则是只会将创建的Activity放在一个栈中,并且这个栈中只会有这一个Activity实例,而且这种唯一性不单纯的限于单个App中,就算有两个应用启动同一个singleInstance模式的Activity,也是只会有一个实例,而且位于一个单独的栈中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值