Activity的启动模式

1. 启动模式的四种类型

(1) standard

标准模式,也是系统的默认模式,每次启动一个Activity都会重新创建一个Activity的实例。不管这个实例是否存在。一个栈中有多个实例,每个实例也可能属于多个任务栈。谁启动了这个Activity,那么该Activity就存在启动了他的那个Activity的任务栈中。比如Activity A启动了Activity B ,那么Activity B就在Activity A的栈中。而当使用ApplicationContext去启动一个activity的时候会报错,原因就在于ApplicationContext没有自己的任务栈,需要添加一个ACTIVITGY_NEW_TASK的flag,来新建一个任务栈,等同于一个Broadcastreceiver启动一个Activity一样,需要添加这个属性。

(2) singleTop

栈顶模式,设置此模式的Activit不会呗重建,他的onNewIntent方法会被回调。通过此方法的参数可以去除当前请求的信息,如果Activity不是位于栈顶,则activity会被城建。

(3) singleTask

栈内复用模式,也可以叫单实例模式,只要Activity存在,系统就不会重建,并且也会回调onNewIntent方法。吧Activity放到任务栈里边的栈顶位置,如果不存在,则创建并且吧Activity放入栈中。举几个例子:
① 任务栈S1中存在ABC三个activity,这时候Activity D以singleTask的模式强求启动,他需要的任务栈是S2,由于S2和D的实例都不存在,则系统会创建S2,然后重建D,吧D放入S2中。
② 另外一种情况,假设D所需要的任务栈是S1,其他情况如上,由于S1已经存在,所以系统会创建D并且吧D方法S1中。
③ 如果实例D在S1中,并且当前任务栈的情况是ADBC,则D不会重建,而是切换到栈顶,并且调用onNewIntent方法,由于singleTask默认具有clearTop的效果,则D上边所有的Activity会被清除,只剩下AD。

(4) singleInstance

单实例模式,比singleTask多了一点,Activity一直都是放在一个单独的栈里边。
———————————————我是分割线——————————————

2. singleTask模式

(1) 现在有两个单独的任务栈,前台任务栈AB,后台任务栈CD,CD的模式是singleTask,如果现在请求D启动,则系统会吧整个的任务栈切换到前台,为ABCD;(2) 如果请求C启动,因为涉及到了Taskaffimty和singleTask一起使用的问题,所以放在最后讲解。
———————————————我又出现了——————————————

3. singleTask另外一种情况

这里先了解下什么是任务栈,便于以后的方便说明。

(1) 任务栈

这要要从一个参数说起,Taskaffimty,可以理解为相关性,这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有的Activity所需的任务栈的名字为应用的包名,当然,我们可以为每个Activity都单独指定Taskaffimty属性,这个属性值必须不能和包名相同,否则相当于没有制定。Taskaffimty主要和singleTask启动模式或者AllowTaskReparening属性配对使用。在其他情况下没有意义。

(2) Taskaffimty和singleTask一起使用,待启动的Activity会运行在名字和Taskaffimty形同的任务栈中。

(3) 当Taskaffimty和AllowTaskReparening结核的时候,这个情况比较复杂,当应用A启动了应用B之后,如果启动的这个Activity的AllowTaskReparening的属性为true,那么应用B被启动之后,此Activity会直接从应用A的任务栈移动到应用B的任务栈中。


Activity的启动模式_第1张图片

比如有两个应用A和B,A启动B的一个Activity C,然后按Home健回到桌面,打开应用B,打开的界面不是应用B的起始界面,而是Activity C,也可以说C从A的任务栈移动到了B的任务战。可以这么理解,A启动了C,这个时候C只能运行在A的任务栈中,但是C属于B,正常情况下,C的Taskaffimty值肯定和A的不同,所以B被启动后,B会创建自己的任务栈,这个时候系统发现C原本需要的任务栈已经被创建过了,所以吧C从A的任务栈中移动过来了。
—————————————————吼 吼————————————————

4. singleTask继续研究

上边说的了一种情况:现在有两个单独的任务栈,前台任务栈AB,后台任务栈CD,CD的模式是singleTask,如果现在请求D启动,则系统会吧整个的任务栈切换到前台,为ABCD;如果请求C启动,现在我们来利用singleTask, Taskaffimty和singleTask一起使用的知识来分析下这种情况。


Activity的启动模式_第2张图片

Activity A使用默认模式(standard),Activity B和Activity C设置启动模式singleTask,并且设置Taskaffimty为com.text.demo(项目包名),现在我们从A跳转到B,然后再从B跳转到C,再从C跳转到A,再从A跳转到B,然后按back键两次,出现的结果是什么

—————————————吼 吼 最后一次出现了——————————————

答案是:回到桌面

分析:此时存在两个任务栈,第一次启动的任务栈,我们命名为S1,此时栈内只有一个Activity A为后台任务栈,另外一个前台任务栈为Activity B、C和D,为什么呢?我们来分析下,第一次启动A,因为A是默认模式,所以系统新建一个实例,然后A跳转到B,B因为设置了singleTask,所以系统会检测B的任务栈是否存在,不存在创建一个新的任务栈,命名为S2,检测B的实例,不存在,创建一个新的实例,然后跳转到B的界面,然后倒转到C呢,因为B和C都设置了Taskaffimty,所以B和C属于同一个栈,所以系统只会创建一个C的实例,然后跳转到C,然后跳转到A呢,因为A的模式是默认模式,每次跳转都会创建一个新的实例,所以现在S2现在的顺序是BCA,然后再跳转到B呢,因为B的任务栈存在,实例也存在,直接跳转,但是上边讲过一条,不知道大家有没有注意,就是singleTask默认具有clearTop效果,所以跳转到B的顺序是CAB,然后清除掉B上边的Activity,现在S2只剩下了B,而S1还存在一个A,所以按两次back键直接会返回到桌面。

你可能感兴趣的:(Activity的启动模式)