activity的4种加载模式

中加载模式有如下4个值,现分别说明:

1.standard:标准模式,即默认值,在这种模式下,当我们打开一个activity时,不管它是不是新的,都会创建一个activity实例,将它存于task栈顶,它的特点在于不管是之前的activity还是新创建的,都会存在在同一个task里,这就是说我们通过getTaskId()最后得到的都是同一个值。

2.singleTop:task单例栈顶模式。在这种模式下,(1)如果想要启动的activity已经位于栈顶了,则不需生成新的activity实例,直接调用即可(2)如果想要启动的activity没有在栈顶,则按照标准模式操作,重新创建一个实例,并置于栈顶。

3.singleTask:task内单例模式。在这种模式下,(1)(2)与single Top相同,(3)如果想要启动的activity已经存在在栈中,只是不在栈顶,这时系统会将栈中在这个activity上的所有activity撤销掉,从而使目标activity转入栈顶。举个例子,activityfirst上有一个可以打开activitysecond的按钮,还有一个文本框可以显示当前这个栈的id,activitysecond上也有这样一个文本框,同时还有一个启动activityfirst的按钮。 现在我们进入activityfirst,文本框会显示当前的taskID为a,然后我们点击按钮,会进入activitysecond,此时文本框也显示activitysecond的所在栈的taskId为b,我们会发现a==b。这时我们点击启动activityfirst的按钮,如果是1,2两个模式,则会生成新的acivity,但在singleTask模式下,则不会,系统会销毁activitysecond,返回到activityfirst。

4.singleInstance:全局单例模式。这种模式下,(1)如果当前的栈中没有要启动的activity,则会生成一个activity,但是,注意,系统会将这个activity单独存放在一个新的task的栈顶,换句话说,还是上面的例子,我们会发下a!=b,这是因为它们存在在不同的task了。(2)如果想要启动的activity已经存在了,无论它存在于应用程序中,位于哪个task中,系统都会将这个activity所在的task转到前台,从而使activity显示出来。  关于这第(2)种情况,如果是在一个应用中,当它从activitysecond中启动按钮回到activityfirst时,它也是直接打开起初已经存在的activityfirst,但是这里与singleTask不同的是,在singleTask中,是会将位于所启动activity上面的activity都销毁,这意味着如果我们在activityfirst中再次点击启动按钮,它会重新生成一个新的activitysecond实例,但在singleInstance中,则只是将我们想要启动的activity找出来,但不会销毁其他的,所以当我们同样点击那个按钮时,出来的activitysecond就是之前那个,而不是新生成的。至于在不同应用中,好吧,我还是晕的,so弄懂了再补充

总结下来就是,standard就是不管什么都新建实例,singleTop就是看栈顶,有就调用,没有就新建。singleTask与singleInstance也是没有就新建,区别在于有的时候,singleTask是判断在不在栈顶,在就是singleTop,不在就销毁前面的,且这些activity在同一个栈;singleInstance是不管在不在栈顶,都直接使它显现,不销毁任何activity,activity在不同栈。

你可能感兴趣的:(android)