Activity需要启动模式,是为了避免多次启动同一个Activity,然后出现重复创建多个实例的问题。目前有standard,singleTop,singleTask,和singleInstance四种启动模式。
*standard*: 标准模式,是系统的默认模式,每次启动一个Activity都会重新创建一个新的实例,即使实例已经存在。创建的实例的生命周期符合典型情况下的Activity生命周期。一个任务栈中可以有多个实例,每个实例可以属于不同的任务栈。谁启动了Activity,那这个Activity,就在启动它的那个Activity所在的栈中运行。当用ApplicationContext去启动standard模式的Activity时就会出错,因为standard模式的Activity默认会进入启动它的Activity所属的任务栈中,但Context属于非Activity类型,并没有所谓的任务栈。解决方法是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,为它在启动的时候创建一个新的任务栈,但这时候实际是以singleTask模式启动。
*singleTop*: 栈顶复用模式。在这模式下,若新的Activity已经位于任务栈的栈顶,那么此Activity就不会被重新创建,同时它的onNewIntent方法会被回调,我们可以通过此方法取出当前请求的信息。另外,该Activity的onCreat和onStart方法不会被系统调用。如果新Activity的实例已存在,但不位于栈顶,仍然会被重建。
*singleTask*: 栈内复用模式。是一种单实例模式,只要Activity在一个栈中存在,即使多次启动Activity都不会重建实例,系统也会回调其onNewIntent方法。另外,singleTask模式的Activity切换到栈顶会导致它之上的栈内的Activity出栈。
![singleTask模式启动过程](http://7xq2jk.com1.z0.glb.clouddn.com/singleTask.png)
*singleInstance*: 单实例模式。是一种加强的singleTask模式,具有此种模式的Activity只能单独位于一个任务栈中,并且由于栈内复用的特性,后续的请求均不会创建新的Activity,除非任务栈被系统销毁。
网友评论