最易懂的Activity启动模式详解

前言

  • Android基础中的Activity启动模式非常重要
  • 本文将介绍对Activity启动模式进行全面介绍

目录


目录

1. 定义

即Activity启动的方式

2. 启动模式的类别

Android启动提供了四种启动方式:

  • 标准模式(standard)
  • 栈顶复用模式(singleTop)
  • 栈内复用模式(singleTask)
  • 单例模式(singleInstance)

3. 知识储备

  • Activity的管理是采用任务栈的形式
  • 任务栈采用“后进先出”的栈结构
  • 每按一次Back键,就有一个Activity出栈

    任务栈

4. 具体介绍

4.1 标准模式(standard)

  • 每启动一次Activity,就会创建一个新的Activity实例并置于栈顶
  • 谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。

    如Activity A启动了Activity B(标准模式),那么B就会进入到A的栈中


    A启动B
  • 因ApplicationContext没有任务栈,所以无法采用标准模式启动Activity。但可通过为待启动的Activity指定标记位:FLAG_ACTIVITY_NEW_TASK,那么在启动时就会为其创建一个新的任务栈(这实际上是采用了singleTask启动模式)

4.2 栈顶复用模式(singleTop)

  • 如果需要新建的Activity位于任务栈栈顶,那么此Activity的实例就不会重建,而是重用栈顶的实例( 调用实例的 onNewIntent() 、不调用onCreate()和onStart())
  • 否则就会创建该Activity新的实例,并放入栈顶

singleTop

4.3 栈内复用模式(singleTask)

逻辑如下图:


singleTask

需要的栈通过参数TaskAffinity决定。

4.4 单例模式(singleInstance)

  • 作为栈内复用模式(singleTask)的加强版
  • 打开该Activity时,直接创建一个新的任务栈,并创建该Activity实例放入新栈中
  • 一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例

    让多个应用共享该栈中的该Activity实例。

  • 使用场景:多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。

4.5 四种启动模式图解


图解

5. 四种启动模式的区别

5.1 决定打开的任务栈

  • standard、singleTop启动模式的Activity的目标任务栈,和收到Intent的发送者在同一个任务栈内
  • singleTask启动模式打开的任务栈由参数TaskAffinity决定
  • singleInstance启动模式总是新建任务栈,不会被启动到一个其他任务栈里

5.2 是否允许多个相同的Activity实例

  • standard、singleTop启动模式中,同一个Activity可以被实例化多次,并且存在于不同的任务栈中,且一个任务栈可以包括同一个Activity的多个实例;
  • singleTask、singleInstance启动模式则限制只生成一个实例

5.3 是否允许不同的Activity实例存在于同一个任务栈内

  • singleInstance启动模式独占一个任务栈,其它Activity实例不能存在于该任务栈里
  • 另外三种模式,则可以和其它Activity实例共存于一个任务栈

5.4 是否每次都生成新实例

  • standard模式:每次都生成新实例
  • singleTop模式:若启动的Activity不在栈顶,则生成新实例;
  • singleInstance模式:所在栈的唯一Activity实例,只会实例化一次,以后每次都被重用。
  • singleTask模式:若启动的Activity不在栈内,则生成新实例;

6. 启动模式的设置

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

  • 在AndroidMainifest设置
  • 通过Intent设置标志位

6.1 在AndroidMainifest设置

在AndroidMainifest的Activity配置进行设置

<activity

android:launchMode="启动模式"
//属性
//standard:标准模式
//singleTop:栈顶复用模式
//singleTask:栈内复用模式
//singleInstance:单例模式
//如不设置,Activity的启动模式默认为**标准模式(standard)**
</activity>

6.2 通过Intent设置标志位

Intent inten = new Intent (ActivityA.this,ActivityB.class);
intent,addFlags(Intent,FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

标记位属性

标记位属性 含义
FLAG_ACTIVITY_SINGLE_TOP 指定启动模式为栈顶复用模式(singleTop)
FLAG_ACTIVITY_NEW_TASK 指定启动模式为标准模式(standard)
FLAG_ACTIVITY_CLEAR_TOP 所有位于其上层的Activity都要移除,一般和singleTask启动模式一起使用

6.3 二者设置的区别

  • Intent设置方式比Manifest设置方式的优先级要高,即以前者为准
  • 限定范围不同
    Manifest设置方式无法设定FLAG_ACTIVITY_CLEAR_TOP标识;Intent设置方式无法设置单例模式(singleInstance)

你可能感兴趣的:(android,Android屏幕适配解决方案)