这个 launchMode 是在 AndroidManifest.xml 中 activity 中配置的。
约定
假设本文用 A -> B,表示 Activity A 中用 startActivity 启动 Activity B。
standard
默认值。
A -> B -> C -> C -> B,此时系统中有五个 Activity,其中 B、C 均有两个。
singleTop
这个与 standard 很相似,只是当目标 Activity 位于栈顶时,不创建新的。
假设 C 是 singleTop 的,则:
A -> B -> C -> C -> B,此时系统中有四个 Activity,其中 B 是两个,而 C 由于是 singleTop,且自己启动自己时位于栈顶,所以不会创建新的。
现在说说哪些情况下目标 Activity 位于栈顶呢?一是自动启动自己;二是目标位于自己的下一层,先 finish() 杀死自己再启动目标,目标就位于栈顶了。题外话:晕,居然自己都 finish() 了,后面的 startActivity 还能运行。
singleTask
这种情况下,只要 Activity 存在,就调用其 onNewIntent 方法,而不是创建一个新的。如果 Activity 不存在,那当然没话说了,创建一个新的。
同时,它还要杀死目标 Activity 栈上部的 Activity。
假设 B 是 singleTask 的,则:
A -> B -> C -> C -> B,此时系统中有两个 Activity,C 被杀死了,B 拿之前的实例来用,并没有创建新的。所以只剩 A、B。
singleInstance
它跟 singleTask 很像,只是它没那么霸道,它并不会杀死栈上部的 Activity。
假设 B 是 singleInstance 的,则:
A -> B -> C -> C -> B,此时系统中有四个 Activity,C 有两个,B 有一个。