activity的启动模式有四种:分别是standard,singleTop,singleTask,singleInstance.
为什么会有这四种模式,先来讲讲activity的管理。我们知道一个应用会有很多个activity,那android用什么数据结构管理这些activity呢?答案是栈,我们称之为任务栈。
栈的特点是后进先出,大家应该都知道。
每创建一个新的activity,把它放在栈的最上面也就是栈顶,当我们按下back键时,就会把
前台任务栈最上面的activity从栈里扔出去,然后就会在界面上显示这个activity下面的那个activity.(对的,任务栈还分为前台的和后台的,正在运行的这个activity所在的任务栈就是前台任务栈,其它都是后台任务栈)
如果创建的是同一个activity,我们也要不断未它创建实例吗?
接下来分别说说我对这四种模式的感受。
standard模式:无论用到什么activity,它都为这个activity创建一个新的实例。这个实例放在启动它的那个activity所在的栈里,假设是activitya启动activityb,那么activityb和activitya放在同一栈里。如果standard不断用c启动c,任务栈里将会是这样:c c c c c c c c c(感觉这种方式是不是傻不拉叽的)
singleTop模式:它比上一个模式聪明点,如果位于栈顶的是同一种activity,它将直接调用,而不会创建新的实例。如果栈顶是c,它就不会再创建c的实例了,而是直接复用这个c。但如果是cba,就是说栈顶是a,它还会创建新的c,变成cbac.(感觉是半傻不拉叽模式,又叫栈顶复用模式)
singleTask模式:哈哈,这种模式比较特别,可以给他指定TakAffinity属性,该属性值默认是包名。即指定以这种模式启动的acitivity所需的任务栈,如果该任务栈不存在,那么先创建这个任务栈,然后创建这个activity,入栈。如果该任务栈已经存在了,则
看这个任务栈里是否有这个activity,如果存在,则让该栈位于这个activity上的所有activity都滚蛋,把这个activity拉到栈顶来。比如:cabd,如果要启动a,则bd滚蛋,变成ca了。
如果这个栈内没有这个activity,就在栈顶创建新的实例。(感觉这种是一夫一妻制,只能有一个,又叫栈内复用模式)
singleInstance模式:这种模式每个activity都在单独的栈内,这个栈里只有也只能有这个activity,感觉相当孤僻,还起个这么长的名字。
我们怎么指定启动模式呢,一个是在代码里指定,一个是在AndroidMenifest内启动。前种方式优先级较高。