说说 LaunchMode ?

2019-11-18  本文已影响0人  Joseph_L

Android 启动模式老生常谈,这篇简单从概念介绍、TaskAffinity以及应用场景三方面讲一下。

概念介绍

Android 主要有四种启动模式,StandardSingleTopSingleTaskSingleInstance

  1. Standard

    标准模式。在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例;

  2. SingleTop

    栈顶复用。这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent 方法会被调用。如果栈内有实例但不在栈顶或者栈内无实例,则情况与standard模式相同;

  3. SingleTask

    栈内复用。如果 Activity 已经存在于当前的任务栈中,无论是否处于栈顶,都会进行复用,在其上的其他实例都会被出栈;

  4. SingleInstance

    单例模式。该模式具备 singleTask模式的所有特性,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例。

    如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例,并且回调 onNewIntent 方法。

TaskAffinity

什么是 TaskAffinity 属性呢?可以简单的理解为任务相关性。

<!-- 不指定 taskAffinity 就默认是包名-->
<activity android:name=".MainActivity"/> 

<activity android:name=".SingleTopActivity"
          android:launchMode="singleTop"
          android:taskAffinity="com.test.singletop"/>

但是要注意的是,这个属性对于 standard 模式和 SingleTop 模式是没有作用的,即,即便是为对应的 Activity 指定 TaskAffinity,它们启动的时候还是会在原来的Task中启动而不是新建。这是因为该属性主要是配合 SingleTask 启动模式使用的。

TaskAffinity & SingleTask

我们之前说,SingleTask 模式下,如果栈中存在某个 Activity 的实例,那就会复用这个 Activity,不管它是否位于栈顶。在复用时,也会将它上面的 Activity 全部出栈,并且会回调该实例的 onNewIntent 方法。

实际上,这个过程中还存在一个任务栈的匹配:这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过 taskAffinity 属性指定,默认为包名;如果这个任务栈不存在,则会创建这个任务栈。

完整的 SingleTask 工作流程如下:

除此之外,还可以将两个不同 App 中的 Activity 设置为相同的 taskAffinity,这样虽然在不同的应用中,但是 Activity 会被分配到同一个 Task 中去。

应用场景
上一篇下一篇

猜你喜欢

热点阅读