Activity的启动模式

来源:互联网 发布:mac怎么同时看两个页面 编辑:程序博客网 时间:2024/06/06 20:31

注:内容来之任玉刚的《Android开发艺术探索》

目前有四种启动模式:Standard,SingleTop,SingleTask和SingleInstance。

1,Standard:标准模式,这也是系统的默认模式。每次启动一个Activity系统都会创建新的Activity实例,不管这个Activity实例是否已经存在。被创建的实例符合A'cActivity典型的生命周期,他的onCreate、onStart和onResume都会被调用。一个任务栈可以有多个实例,多个实例也可以在不同的任务栈。比如Activity A启动了Activity B(通过Standard模式),那么B就会进入到A所在的栈中。注意,当我们使用ApplicationContext去启动Activity(Standard模式)时,Activity会报错,因为Standard模式的Activity默认会进入启动它的Activity所在的任务栈中,但是由于非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈,所以就会报错。解决这个问题的方法是为待启动的Activity制定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候会为他创建一个新的任务栈,这个时候启动Activity实际上是以singleTask模式启动的。

2,singleTop:栈顶复用模式,在这种情况下如果新的Activity已经位于任务栈的栈顶了,那么次Activity就不会被重新创建,同时Activity的onNewIntent也会被调用,通过此方法的参数,我们可以取出当前请求的信息。需要注意的是,这个Activity的onCreate、onStart不会被调用,因为他没有发生改变。如果新的Activity的实例已存在但是没有位于任务栈的栈顶,那么新Activity依然会被重建。

3,singleTask:栈内复用模式。这是一种单实例模式,在这种模式下,只要Activity在一个栈里面存在,那么多次启动该Activity都不会被重建,和singleTop一样,系统也会回调onNewIntent方法。具体一点,当一个具有singleTask模式的Activity请求启动后,比如Activity A,系统首先会寻找是否存在A需要的任务栈,如果不存在就重新创建一个任务栈,然后创建A的实例后把A放到栈中。如果存在A所需的任务栈,这时要看A是否在栈中有实例存在,如果有实例存在,那么系统就会把A调到栈顶并调用他的onNewIntent方法,如果实例不存在,就创建A的实例并把A压入栈中。例如:

(1)比如目前任务栈S1中的情况为ABC,这个时候Activity D 以singleTask模式请求启动,其所需要的任务栈为S2,由于S2和D的实例都不存在,所以系统会先创建任务栈S2,然后再创建D的实例并将其放入S2中。

(2)另外一种情况,假设D所需要的任务栈为S1,其他情况如上面的例子1,那么由于S1已经存在,所以系统会创建D的实例并将D的实例放入S1的栈中。

(3)如果D所需的任务栈为S1,并且S1的情况为ADBC,根据栈内复用的原则,D不会重建,系统会把D调到栈顶并调用D的onNewIntent方法,同时由于singleTask有clearTop的效果,会导致所有在D上面的Activity全部出栈,于是最终为AD。

4,singleInstance:单实例模式。这是一种加强的singleTask模式,他具有除了singleTask的所有特性外,还加强了一点,那就是具有singleInstance模式的Activity只能单独的位于一个任务栈中,换句话说,如果Activity A是singleInstance模式,当A启动后系统会为A创建一个新的任务栈然后A单独在这个任务栈里面,由于栈内复用的特性,后面的请求都不会重新创建A的实例,除非这个独特的任务栈被系统销毁了。

0 0
原创粉丝点击