启动界面如下:MainActivity—>Activity1—>Activity2—>Activity3—>MainActivity—>MainActivity.
通过android:launchMode设置启动模式
默认模式standard

Android系统默认的启动模式就是standard,当启动模式为standard时,Log如下
可以看到当Acitivity3启动位于栈底的MainAcitivity时,是重新创建了一个实例,也就是说,无论栈底是否有MainAcitivity的实例,都会重新创建一个新的实例。
栈顶复用模式singleTop

由于singleTop的启动模式是栈顶复用,启动顺序不变,Log如下
前面的启动没有什么变化,但注意最后从MainActivity—>MainActivity这一步,由于MainActivity在栈顶,所以并没有重新创建一个MainActivity,而是调用了一遍MainActivity的onPause和onResume。
这时候可以脑洞大开,当想要避免重复打开一个Activity的时候,就可以设置此模式,比如在通知栏点击跳转到Activity的时候。
栈内复用模式singleTask

当启动模式为singleTask时,如果栈内已经有该Activity的实例的情况下去启动该Activity,不仅会复用该Activity并把它置于栈顶,而且会把该Activity之上的所有实例全部清空。Log如下:
从Activity3到MainActivity开始看起,因为MainActivity本身位于栈底部,所以以此模式启动Mainctivity时,不仅复用MainActivity并把它置于栈顶,而且將位于MainActivity之上的实例全部清除,所以此时如果退出MainActivity,就会直接退出应用。

如果有两个不同的任务栈,其中一个去启动另一个会怎样呢,如下图所示:
这时候如果以singleTask的方式从前台任务栈T4中的B去启动后台任务栈T4中的D,这时候后D会位于栈顶,由于D上面已经没有实例,所以从上到下会变成D—>C—>B—>A。而如果去启动的是C,那么不仅会把C置于栈顶,而且还会清除C之上的实例D,就变成了C—>B—>A。
脑洞大开,因为退出一个应用的主页就意味着退出这个应用的所有就面,所以主页可以使用singleTask的方式启动,这样退出主页,位于主页之上的所有Activity实例就都销毁了。
单一实例模式singleInstance

单一实例模式与栈内复用模式有相似之处,都会复用之前栈内存在的实例,但是不同的是,singleInstance无论什么时候,都只会保证一个实例。并且singleInstance不会把栈顶之上的实例清除掉。Log如下:
可以看到Activity3—>MainActivity的时候,由于之前存在MainActivity的实例,所以直接复用,这时候MainActivity直接位于栈顶。栈内的顺序从MainActivity—>Activity1—>Activity2—>Activity3变为Activity1—>Activity2—>Activity3—>MainActivity。可以看到并没有清除MainAcitivity之上的实例。
通过Intent的Flag设置启动模式
当flag为Intent.FLAG_ACTIVITY_NO_HISTORY
这时候如果从Activity1—>Activity2,在启动Activity2的同时,会清除掉Activity1的实例,但是从实际测试中有一种情况除外,单就是从MainActivity启动Activity1的时候,并没有清除掉Mainctivity,其他都会清除启动Activity实例。Log如下:

当flag为Intent.FLAG_ACTIVITY_NEW_TASK

这种启动模式与之前提到的standard很相似,不再介绍,Log如下:
当flag为Intent.FLAG_ACTIVITY_SINGLE_TOP

这种模式在实际测试中与singleTop并不相同,当把MainActivity设置为singleTop,此时以上述Flag来启动Activity1,2,3,在从Activity3启动Mainctivity,并没有复用MainActivity,而是重新创建了一个MainActivity的实例,而从MainActivity启动自身,才复用了MainActivity的实例,Log如下:
当flag为Intent.FLAG_ACTIVITY_CLEAR_TOP

这种flag与singleTop相似,但是也有不同之处,当Activity3启动MainActivity时,不是重新复用,而是把MainActivity销毁后重新创建了一个MainActivity实例,Log如下:
当flag为Intent.FLAG_ACTIVITY_CLEAR_TASK

实际测试中与standard相似,每次都会重新创建一个实例,Log如下:
本文参阅:
http://www.jianshu.com/p/2a9fcf3c11e4
网友评论