Activity共有四种启动模式:standard、singleTop、singleTask、singleInstance。
在清单文件中为Activity设置启动模式,不设置默认是standard模式
各个模式详解:
1. Standard
默认值。系统在启动 activity 的 task 中创建一个新的 activity 实例,并把 intent 传送路径指向它。 该 activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中也可以存在多个实例。
- singleTop
如果 activity 已经存在一个实例并位于当前 task 的栈顶,则系统会调用已有实例的 onNewIntent() 方法把 intent 传递给已有实例,而不是创建一个新的 activity 实例。 activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中可以存在多个实例(但仅当 back stack 顶的 activity 实例不是该 activity 的)。
比如,假定 task 的 back stack 中包含了根 activity A 和 activities B、C、D(顺序是 A-B-C-D;D 在栈顶)。 这时过来一个启动 D 的 intent。 如果 D 的启动模式是默认的"standard",则会启动一个新的实例,栈内容变为 A-B-C-D-D。 但是,如果 D 的启动模式是"singleTop",则已有的 D 实例会通过 onNewIntent() 接收这个 intent,因为该实例位于栈顶——栈中内容仍然维持 A-B-C-D 不变。 当然,如果 intent 是要启动 B 的,则 B 的一个新实例还是会加入栈中,即使 B 的启动模式是"singleTop"也是如此。
- singleTask
系统将创建一个新的 task,并把 activity 实例作为根放入其中。 但是,如果 activity 已经在其它 task 中存在实例,则系统会通过调用其实例的 onNewIntent() 方法把 intent 传给已有实例,而不是再创建一个新实例。 此 activity 同一时刻只能存在一个实例。
注意: 虽然 activity 启动了一个新的 task,但用户仍然可以用回退键返回前一个 activity。
- singleInstance
除了系统不会把其它 activity 放入当前实例所在的 task 之外,其它均与"singleTask"相同。 activity 总是它所在 task 的唯一成员;它所启动的任何 activity 都会放入其它 task中。