Android Activity LaunchMode 一共分为standard,singleTop,singleTask,singleInstance四种模式,每种模式对应启动Activity的方式不一样。
模式可以分为两大类,一类是standard和singleTop,另一类是singleTask和singleInstance及其它;
设置为standard或singleTop启动模式的Activity可以多次实例化。实例可以属于任何任务也可以位于Activity栈的任何地方。典型地,一个任务通过调用函数startActivity() (除非intent对象包含FLAG_ACTIVITY_NEW_TASK)来启动Activity。standard和singleTop模式和其它模式仅仅有一个方面不同:总会有一个intent对应的standard Activity,为了响应这个intent会创建一个新的实例。每个实例处理一个intent。同样地,为处理intent也会创建一个新的singleTop Activity实例。然而,如果目标任务已经有一个Activity实例在栈的顶层,这个实例会收到新的intent(在onNewIntent()里调用);一个新的实例不会被创建。其它情况下——例如:如果存在一个singleTop Activity实例,但是没有在栈顶,或在栈顶但是没有在目标任务——一个新实例会被创建并且放到栈里。
singleTask和singleInstance模式和其它Activity有一个方面的不同:singleTask Activity允许任务存在其它Activity。这种Activity总是位于任务的根,但是其它Activity(standard和singleTop Activity)可以在任务里启动。singleInstance Activity,另一方面不允许其它Activity存在于任务里。它是任务里仅有的Activity。如果启动了其他Activity,那个Activity被赋值给其它任务——就像在FLAG_ACTIVITY_NEW_TASK intent。
用例 | 启动模式 | 多实例? | 注释 |
---|---|---|---|
大多数Activity的启动模式 | standard | 是 | 默认值。系统总是在目标任务里创建一个新的Activity实例,并且路由一个intent给Activity。 |
大多数Activity的启动模式 | singleTop | 有条件的 | 如果Activity的实例已经在任务的栈顶存在,系统通过调用函数onNewIntent() 路由intent到Activity的实例,而不是创建一个新的Activity实例。 |
指定启动(一般不建议使用) | singleTask | 否 | 系统在任务的根创建一个Activity并且把intent传递给它。然而,如果已经有一个Activity存在了,系统通过调用函数onNewIntent()传递intent,而不是创建一个新的Activity。 |
指定启动(一般不建议使用) | singleInstance | 否 | 就像singleTask,除非系统启动其它Activity,否则,Activity总是唯一的,仅仅属于它的任务。 |
就像上表里展示的,standard 是默认的模式,SingleTop 也是适合大多数Activity的模式。也是很常见、有用的启动模式。其它模式——singleTask 和singleInstance ——不适合大多数程序,它们在一个相互作用的模式对于用户来说不常见,也会和其它程序很不同。
不论你选择什么启动模式,记得测试它们的可用性并且通过Back按钮从其它Activity或任务返回到这个Activity。