活动的启动模式有哪些

  介绍

今天就跟大家聊聊有关活动的启动模式有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。


标准

这种是标准启动模式,默认就是这种启动模式。每次启动这种启动模式的活动的时候都会创建一个新的实例放入栈中,不管栈中是否已经存在相同的实例。这也是最容易理解的。

singleTop

顾名思义,栈顶是单一实例的。什么意思呢。假设你现在启动一个ActivityA,但是这个时候已经存在一个ActivityA实例在栈顶,那么这个时候,就不会创建新的实例。但是如果,在非栈顶存在相同的实例,还是会创建新的实例的,例如,现在栈中的活动是ABC,一处于栈顶,然后此时启动,是不会再创建一个一个活动出来,而是执行一个的onNewIntent方法;但是如果此时启动C活动,由于栈顶是一个不是C,那么还是会创建一个新的C实例出来,此时的栈情况就是课程。

singleTask

单一任务模式。这个模式的意思是,在该活动的启动栈中,只能存在单一实例,不管是否位于栈顶。与其他启动模式不同的是,这个启动模式可以指定栈去启动。例如现在有一个栈,但是你可以给活动一指定一个栈名dev,那么启动一个的时候就会创建一个栈叫做开发,所以singleTask的意思就是,当你启动一个启动模式为singleTask的活动的时候,如果栈中没有相同的实例,那么就会创建一个新的实例放入栈中,如果指定栈中存在相同的实例,例如栈中有ABC,然后你启动B,那么这个时候不会去创建新的B实例,而是把B放到栈顶,并把一顶出去,再执行B的onNewIntent方法,此时栈的情况就是BC。
细心的读者会发现“顶出去”。是的,我们都知道栈是后进先出的特点,例如你往筒里放了3个羽毛球,那你想要拿到中间那个羽毛球,是不是只能先把上面那个抽出来呢,同样的道理,要想把B提到栈顶,那么必须把一顶出来。可能会有很多读者误以为启动后是BAC,但其实是公元前,因为一个得先出栈,B才能出来。同理,如果栈中是ADFBC,这个启动B,也是公元前上面的全部被出栈了。

singleInstance

单例模式。这个是singleTask的强化版本。他会自己新建一个栈并把这个新的实例放进去,而且这个栈只能放这个活动实例。所以当重复启动这个活动的时候,只要他存在,都是调用这个活动onNewIntent方法并切换到这个栈中,并不会去创建新的实例。

设置启动模式的两种方法

了解了活动的四种启动模式,接下来看看如何给他指定启动模式。

静态设置

静态设置就是在AndroidManifest中给具体活动设置启动模式。通过给活动指定launchMode参数来设置启动模式,例如:

, & lt; activity  android: name=?MainActivity"   ,,,,,android: launchMode=皊ingleInstance"/祝辞

动态设置

动态设置是在启动活动的时候再指定启动模式,例如:

Intent  Intent =, new 意图();   intent.setClass(这个,SecondActivity.class);   intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);   startActivity(意图);

可以看到我们通过意图。addFlags这个方法来指定启动模式,这个方法传入一个参数来指定启动模式,其他的参数有:

<李>

FLAG_ACTIVITY_NEW_TASK: singleTask模式

<李>

FLAG_ACTIVITY_SINGLE_TOP: singleTop模式

<李>

FLAG_ACTIVITY_CLEAR_TOP:清除该活动上方的所有活动。一般和singleTask一起使用。但是如果你的启动模式是标准,那么这个活动连他之上的所有活动都会被出栈再创建一个新的实例放进去。例如现在栈中是ABCD,以FLAG_ACTIVITY_CLEAR_TOP +标准模式启动C的时候,首先清理掉ABC是的,C也会被清理,然后再创建一个新的C放进去,执行之后就是CD。

特别注意的坑

singleInstance返回任务栈

现在模拟一个场景:现在有三个活动A, B, C的一个和启动模式都是标准,B的启动模式是singleInstance。先启动,再启动B,然后再启动C这个时候问题来了,如果我这个时候按下返回键,是回到B吗?答案是回到A .再按一下呢,返回桌面吗?答案是回到B,再按一下再回到桌面。其实不难理解。我们都知道singleInstance会创建一个独立的栈,当我们启动一个的时候,一位于栈中,启动B的时候,就会创建一个栈第二并把B实例放进去。这个时候再启动C就会切换到栈第一,因为singleInstance创建的栈只能放一个,所以C会放到栈中,当按下返回的时候,栈中第一的活动就会依次出栈,直到全部出完,才会切换到栈中。所以要注意这个点。

活动的启动模式有哪些