Activity的LaunchMode
什么是Task
先讲一下android中的Task。可以把它看做是一个栈,用在存放Activity的栈,只有两个动作,进栈和出栈,遵循先进后出的原则。
一、Activity的启动模式有四种:
1.Standard
2.singleTop
3.singleTask
4.singleInstance
问:哪里设置Activity的启动模式呢?
答:在Menifest.xml中设置Activity的属性android:launchMode="singleTop"
问:这些启动模式的设置决定了什么?或者作用是什么?
答:决定了他们在Task中的存在方式
二、四种模式的解释
1.standard
默认的模式,每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
2.singleTop
当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。如不在栈顶,则新建实例(每个Task都可以有,且可以有多个,在栈顶时可复用)
3.singleTask
新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
4.singleInstance
新建一个Task,且在该Task中只有它的唯一一个实例。(只有一个Task会有,且该Task中只有它)
三、演示
实例一、
如上图,创建三个Activity,每个Activity中都有一个Button,单击后会跳到下一个Activity。
默认是standard模式,这时候看一下Task中的情况
会看到在TaskA中有两个ActivityA,所以standard是每次都在初始化一个新的Activity
实例二、
为了证明singleTop模式,我们将Activity之间的跳转方式改变一下,如下图
先用一个Activity证明吧,这是一个Activity,点击按钮后跳到他本身。例子本身没有什么实际作用,只是为证明singleTop
如果是模式standard模式,大家想一下,栈的情况会是怎样的?
Task栈中情况如下
但如果是singleTop中,不管你按多少次button,栈中的情况只有一种,singleTop会判断当前这个Activity是不是在Task的顶部,如果是在顶部就不会去new,如果不是,就会new,
如果把实例一中的每个Activity的launchMode都设置成singleTop,那么Task中的情况回合是实例一栈的情况是一模一样的。
实例三、
关于singTask,singleTask模式和后面的singleInstance模式都是只创建一个实例的。
如果ActivityA设置了singleTask,那个么栈中只有ActivityA的一个实例,但是可以包含ActvityB,ActivtyC的实例,这与singleInstance是有区别的,singleInstance是一个栈中只有这一个Activity的实例,只有一个。
将实例一中的ActivityA设置为singleTask模式,如下图
则栈中的关系如下
我们看到在4步的时候发生了变化,栈中就只有ActivityA了,此时如果按Back键时,就退出了程序。
由ActivityC到ActivityA进行跳转时,Task中到发生了什么?
因为Activity A的家在模式为singTask,会先判断TaskA中是否有ActivityA的实例,如果有,就不用实例化了,如果没有就要实例化。结果在TaskA中有Activity的实例,但是在栈底,这时候怎么办呢,会先将ActivityC弹出栈,然后在弹出ActivityB弹出栈。如下图
实例四、
ActivityA的launchMode为singInstance,会创建一个新的Task,然后在Task中只有一个实例就是ActivityA.
栈中情况如下
这种模式下,要注意Activity的回退情况,就是按Back键的时候Activity的回退情况。此时如果按Back键,先返回到ActivityA,然后是C,B。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。