Android面试(9): Activity的四种启动模式对比

Activity四种启动模式: standard(标准模式)、singleTop(栈顶复用模式)、singleTask(栈内复用模式)、singleInstance(单实例模式)。Android 中默认启动模式为 standard,我们可以通过在 AndroidManifest.xml 的 activity 标签下通过 launchMode 属性指定我们想要设置的启动模式。

standard(标准模式)
    标准模式,系统默认模式。每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在。这是一种典型的多实例实现,一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。在这种模式下,谁启动了这个 Activity,那么这个 Activity 就运行在启动它的那个 Activity 所在栈中。

singleTop(栈顶复用模式)
    栈顶复用模式。在这种模式下,如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时它的 onNewIntent 方法会被回调,通过此方法的参数我们可以取出当前请求的信息。如果新 Activity 的实例已存在但不是位于栈顶,那么新 Activity 仍然会重新创建。

singleTask(栈内复用模式)
    栈内复用模式。这是一种单实例模式,在这种模式下,只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,和 singleTop 模式一样,系统也会回调其 onNewIntent。
    注意,这里我们分 3 种情况来理解这个 launchMode:
    1. 被启动的 Activity 任务栈不存在:
        此时会新建一个该 Activity 的任务栈,并将 Activity 实例放到任务栈中。
    2. 被启动的 Activity 任务栈存在,但是任务栈中该 Activity 实例不处于栈顶而在栈内:
        此时会先将该 Activity 实例上面的其它 Activity 实例全部出栈(因为该启动模式默认具有 clearTop 效果)并将要启动的 Activity 实例置于栈顶,系统调用其 onNewIntent 方法。
    3. 被启动的 Activity 存在任务栈,而且该 Activity 实例在该任务栈栈顶位置:
        直接复用任务栈中的该 Activity 实例,并调用其 onNewIntent 方法。

    这里我们还需要注意一个 Activity 的属性 TaskAffinity,可以翻译为任务相关性。它标识了一个 Activity 所需要的任务栈的名字,默认情况下,所有 Activity 所需的任务栈的名字为应用的包名。这个属性主要和 singleTask 启动模式或者 allowTaskReparenting 属性配对使用,在其它情况下没有意义,为这个启动的 Activity 的任务栈指定相应的名称。

singleInstance(单实例模式)
    单实例模式。这是一种加强的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,还加强了一点,那就是具有此种模式的 Activity 只能单独地位于一个任务栈中。

参考自主席的《Android 开发艺术探索》

你可能感兴趣的:(Android面试相关,Android面试)