【Android

  Activity的启动模式目前有四种:standard、singleTop、singleTask 和 singleInstance。

1、standard

  standard 是标准模式,也是系统的默认启动模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的任务栈中。例如,Activity A启动了Activity B(B的启动模式是standard),那么Activity B就会进入到Activity A所在的任务栈中。

2、singleTop

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

3、singleTask

  singleTask 是栈内复用模式。当一个具有singleTask模式的Activity请求启动时(例如Activity A),系统首先会寻找是否存在 A 想要的任务栈,如果不存在这个任务栈,那么系统就会创建一个新的任务栈,然后创建一个新的Activity并放入这个任务栈中;如果存在 A 所需的任务栈,这时要看 A 是否存在于这个任务栈中,如果有实例存在,那么就将 A 调到栈顶,并回调 A 的 onNewIntent() 方法;如果 A 不存在于任务栈中,则创建一个新的Activity并放在这个任务栈的栈顶。

  上面所说的 “将A调到栈顶”,具体的做法是:如果A本来就在栈顶,则不采取任何操作;如果A不在栈顶,则将A上面的所有Activity全部清理掉(这种做法也叫 clearTop 效果)。

4、singleInstance

  singleInstance 是单实例模式。具有这种模式的Activity只能单独的存在于一个任务栈中,由于任务栈具有复用性,因此后续对这个Activity的请求都不会再创建新的Activity(除非这个独特的任务栈被系统销毁了),只会将运行与后台的这个 singleInstance 任务栈切换到前台运行。

设置启动模式的两种方式

  设置启动模式有两种方式:

  (1)在 Menifest 文件中设置,示例代码如下:

<activity
    android:name="my.itgungnir.launchmode.MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleInstance"    
/>

  这里的 launchMode 属性中可以填入的值有四种:standard、singleTop、singleTask 和 singleInstance。

  (2)在 JAVA 代码中设置,示例代码如下:

Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

  这里的 addFlags 方法中可以填入的值有三种:

    • Intent.FLAG_ACTIVITY_NEW_TASK:相当于在Menifest文件中指定Activity的launchMode为 singleTask;
    • Intent.FLAG_ACTIVITY_SINGLE_TOP:相当于在Menifest文件中指定Activity的launchMode为 singleTop;
    • Intent.FLAG_ACTIVITY_CLEAR_TOP:如果结合singleTask使用,则效果和使用singleTask相同,即创建新的Activity时,如果此Activity存在于任务栈中,则清理调栈中这个Activity之上的所有Activity;如果是结合standard使用,则除了要清理掉这个Activity上面的所有Activity之外,这个Activity本身也需要先销毁,然后重新创建一个新的Activity放于栈顶。

  上面的两种方法,第二种方法的优先级大于第一种方法,因此当这两种方法同时存在时,以第二种方法的设置为准。

TaskAffinity

  Activity 的 taskAffinity(可以翻译为任务相关性)属性标志了这个 Activity 所需的任务栈的名字,在默认情况下,所有 Activity 的 taskAffinity 属性的值都是 Activity 所在应用的包名。我们可以通过设置Activity的taskAffinity属性来设置这个Activity将要运行在哪个任务栈中。

  当启动一个设置了 taskAffinity 属性的 Activity 的时候,这个 Activity 就会被运行到以 taskAffinity 属性为名称的任务栈中。

  在使用 taskAffinity 属性时需要注意以下两点:

    • (1)taskAffinity 属性的值不能和应用包名相同,否则相当于没有指定;
    • (2)taskAffinity属性的值为字符串,且中间必须含有包名分隔符(“.”)。
原文地址:https://www.cnblogs.com/itgungnir/p/6491815.html