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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yz_cfm/article/details/85601516

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 开发艺术探索》

猜你喜欢

转载自blog.csdn.net/yz_cfm/article/details/85601516