Android Activity 的启动模式(Launch Mode)

1.  什么是 Activity 的启动模式?

Activity 的启动模式决定了在启动一个 Activity 时,它在任务栈中的行为。任务栈(Task Stack)是一个先进后出的堆栈结构,管理着应用中的 Activity。通过配置启动模式,我们可以控制 Activity 在任务栈中的实例化和复用行为,从而优化用户体验和应用性能 

2. 四种启动模式详解

  • standard 

    ------------------------
    | Activity A           |
    ------------------------
    | Activity B           |
    ------------------------
    | Activity A           |
    ------------------------

这是默认的启动模式。每次启动 Activity 时都会创建一个新的实例,并将其推入任务栈中。

特点:

  • 每次启动都会创建新的实例。
  • 每个实例都会有一个独立的生命周期。

使用场景:

  • 适用于大多数需要多次实例化的 Activity,比如一个普通的详情页面。

示例:

  • singleTop

如果要启动的 Activity 已经位于任务栈的栈顶,则不会创建新的实例,而是复用栈顶的实例,并调用其 onNewIntent 方法。

    ------------------------
    | Activity A           |
    ------------------------
    | Activity B           |
    ------------------------
    | Activity A (复用)     |
    ------------------------

特点:

  • 如果 Activity 已在栈顶,则复用该实例。
  • 否则,创建新的实例。

使用场景:

  • 适用于频繁跳转回同一页面的情况,比如通知点击后打开的页面。

示例:

  • singleTask

如果要启动的 Activity 在任务栈中已经存在,则会复用该实例,并将其上的所有其他 Activity 移出栈外,同时调用 onNewIntent 方法。

    ------------------------
    | Activity A           |
    ------------------------
    | Activity B           |
    ------------------------
    | Activity C           |
    ------------------------
    | Activity A (复用)     |
    ------------------------

特点:

  • 复用任务栈中已有的实例。
  • 清除该实例之上的所有 Activity。

使用场景:

  • 适用于需要确保某个 Activity 只有一个实例的情况,比如应用的主页面。

示例:

  • singleInstance

这种模式类似于 singleTask,但它会为该 Activity 创建一个单独的任务栈,并且该栈中只能有这一个 Activity 实例。

    独立任务栈:
    ------------------------
    | Activity A (独立)     |
    ------------------------

特点:

  • 复用独立任务栈中的唯一实例。
  • 该任务栈中只能有这一个 Activity。

使用场景:

  • 适用于需要独立任务栈的特殊页面,比如视频播放或电话拨号页面。

示例:

3. 如何在 AndroidManifest.xml 中配置启动模式

在 AndroidManifest.xml 文件中可以通过 android:launchMode 属性配置 Activity 的启动模式。

示例:


    
        
            
            
        
    

4. 使用 Intent Flags 控制启动模式

除了在 AndroidManifest.xml 中配置启动模式,还可以通过 Intent 的 flags 动态控制 Activity 的启动行为。

常用的 flags:

  • FLAG_ACTIVITY_NEW_TASK
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_CLEAR_TOP

示例:

val intent = Intent(this, SingleTopActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
startActivity(intent)

你可能感兴趣的:(android)