Activity的启动模式一共有四种,它们是:standard、singleTop、singleTask、singleInstance,用于给activity标签中的android.launchMode属性赋值。
这里面有些容易混淆的地方。
在理解上,最需要注意的是:所有这些,都和所谓的“任务”相关,和所谓的“全局”不相关,另外,就是不能望文生义,只是看字面翻译来理解,因为从下面的分析可以看出,不同的“single”有不同的意思。
假设有一种Activity B用于处理某种Intent X,则当一个这种 X 的实例到达时,不同启动模式是以如下的方式影响处理过程的:
standard:缺省启动模式。即每当有 X 的实例需要处理时都创建一个新的 B 实例,与创建者在一个堆栈中,并被放放在堆栈顶部。
singleTop:当需要处理的 X 的实例到达时,如果堆栈顶部是一个 B 的实例,那就不创建新实例来处理,而直接使用堆栈顶部的那个。否则就创建一个新的,剩下的过程就跟standard模式相同了。singleTop 的含义似乎是“用处于堆栈顶部的那个处理”。
singleTask:以这种模式启动的 Activity 一定会放在一个新任务中,所以它一定位于堆栈的最底端,与创建者并不在一个堆栈中。如果它创建了其他Activity,那么其他的Activity将放在别的堆栈中。所以,看起来singleTask的含义似乎是“任务中唯一的Activity实例”。
singleInstance:以这种模式启动的 Activity 一定会放在一个新任务中,所以它一定位于堆栈的最底端,与创建者并不在一个堆栈中,这部分与singleTask模式完全相同。不同的是,如果它创建了其他的Activity实例,那么那些实例将放在它的上方,而不是另一个任务中。当需要处理的 X 的实例到达时,如果此时 B 的实例位于堆栈顶端,则可以处理这个 X 的实例,否则,这个 X 的实例将不处理,而被放弃。singleInstance的含义似乎有“在一个任务中最多创建多一个实例”的含义。当然,因为只能有一个实例,那么如果这个实例没有位于堆栈的顶部,专由它处理的 Intent 就只能被放弃了。