说明一下,你们看这个帖子以前对Task,有必定的了解。并且看完这个以后,最好再看看taskAffinity属性,由于在实际应用中他们通常是联合使用的。spa
在Android的中Activity有4种启动方式:"standard"、"singleTop"、"singleTask"、"singleInstance"。orm
下面就分轻重点讲讲这些启动方式。get
一、standard启动方式it
这种方式也是系统默认的。说的简单点,咱们在使用startActivity()方法的时候,系统就会启动一个新的Activity实例,无论它先前启动没有。若是想知道具体细节能够查看这个帖子http://marshal.easymorse.com/archives/2950,我在这里就不细细讲解了。方法
配图说明:im
二、singleTop启动方式总结
若是你们把standard启动方式看懂了,这个我就说一下区别,你们就明白了。若是咱们要调用的Activity在Task栈顶,系统不会像在standard方式下建立一个新的实例,而是调用onNewIntent()方法,来引导intent到栈顶的实例。若是调用的Activity不在Task栈顶,系统此时调用方式与standard方式下的如出一辙。margin
举个例子:activity
如今task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,若是D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。top
若是D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D
若是这时候给B发Intent的话,无论B的launchmode是”standard” 仍是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
注意:在一个Activity处理新的intent的时候,用户不能使用Back button来返回到先前的Activity。直到新的intent到达onNewIntent()方法中后,才能够。
三、singleTask启动方式
若是已经有其余的Task而且包含Activity实例,那就直接调用那个Task的实例。(只有一个Task中会有) 而不是建立一个新的实例。重点:假如你启动一个singleTask的Activity,同时这个Activity在background task中,那么整个background task都会被调入到前台来。下面这幅图就很好的说明这个问题。
有人问若是我调用图中的Activity X,会怎样?系统会先把Activity Y销毁,而后再将Activity X放到前台。
四、singleInstance启动方式
singleInstance 新建一个Task,且在该Task中只有它的惟一一个实例。 (只有一个Task会有,且该Task中只有它)。“singleInstance”是其所在栈的惟一activity,它会每次都被重用。
总结:
standard 每次都会新建,每一个Task均可以有,且每一个Task均可以有多个实例(每一个Task均可以有,且能够有多个)
singleTop 当前实例若是在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例 (每一个Task均可以有,且能够有多个,在栈顶时可复用)
singleTask 新建一个Task,若是已经有其余的Task而且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
singleInstance 新建一个Task,且在该Task中只有它的惟一一个实例。 (只有一个Task会有,且该Task中只有它)
intent的flag能够覆盖activity的启动模式:
FLAG_ACTIVITY_NEW_TASK 相似singleTask
FLAG_ACTIVITY_SINGLE_TOP 相似singleTop
FLAG_ACTIVITY_CLEAR_TOP 无对应
补充说明,里面遗漏的东西。
用户必定要可以离开一个task,和再回到这个task。因此,"singleTask"和"singleInstance",只能用做启动Activity的属性。若是不这样,咱们在启动一个singleTask的Activity以后,使用Home键到主界面,就会回不去了,由于它不表明一个应用的启动。