Android中四大组件之一的Activity的启动模式

Android 中 Activity 这个核心组件的启动模式,这是理解 Android 页面跳转和任务栈管理的关键知识点。

Activity 启动模式详解

Activity 的启动模式(Launch Mode)决定了新的 Activity 实例如何与任务栈(Task Stack) 交互,主要用于优化页面跳转逻辑、避免重复创建实例、控制返回栈行为等。Android 提供了 4 种核心启动模式,可在AndroidManifest.xml中通过android:launchMode属性配置,也可通过Intent添加标志位动态指定。

1. standard(标准模式,默认)
  • 核心逻辑 :每次启动 Activity 都会创建新的实例,不管任务栈中是否已有该 Activity 实例。

  • 任务栈行为:新实例会被压入当前任务栈的栈顶。

  • 适用场景:绝大多数普通页面(如首页的子页面、详情页),适合需要多次打开的场景。

  • 示例

    复制代码
    <activity
        android:name=".MainActivity"
        android:launchMode="standard" />
  • 特点

    • 每个实例都有独立的生命周期。
    • 按返回键时,栈顶实例依次出栈,直到栈空。
2. singleTop(栈顶复用模式)
  • 核心逻辑 :如果要启动的 Activity 已经位于当前任务栈的栈顶,则复用该实例,不会创建新实例;若不在栈顶,则创建新实例。

  • 任务栈行为 :复用实例时,系统会调用该 Activity 的onNewIntent(Intent intent)方法传递新的 Intent,不会走onCreate(),但会走onResume()

  • 适用场景:接收通知跳转的页面、搜索页面(避免连续点击通知创建多个相同页面)。

  • 示例

    复制代码
    <activity
        android:name=".SearchActivity"
        android:launchMode="singleTop" />
  • 关键注意点 :仅检查栈顶,若 Activity 在栈中但不在栈顶,仍会创建新实例。

3. singleTask(栈内单例模式)
  • 核心逻辑 :确保整个任务栈中只有一个该 Activity 实例 。启动时系统会检查:

    1. 若任务栈中无该实例:创建新实例并压入栈。
    2. 若任务栈中有该实例:将该实例之上的所有 Activity 出栈,使该实例成为栈顶,并调用onNewIntent()
  • 任务栈行为 :可通过android:taskAffinity指定所属任务栈(默认与应用包名一致)。

  • 适用场景:应用的主页面(如首页)、购物车页面(确保全局只有一个实例)。

  • 示例

    复制代码
    <activity
        android:name=".HomeActivity"
        android:launchMode="singleTask" />
  • 特点:会 "清理" 目标实例上方的所有页面,适合作为应用的核心页面。

4. singleInstance(全局单例模式)
  • 核心逻辑 :整个系统中只有一个该 Activity 实例,且该实例独占一个独立的任务栈(整个系统唯一)。

  • 任务栈行为:其他应用 / 页面启动该 Activity 时,都会跳转到这个独立任务栈中的实例;返回时先回到原任务栈,再处理该独立栈。

  • 适用场景:系统级的页面(如来电界面、锁屏界面)、需要全局唯一且与其他页面隔离的功能(如微信的浮窗聊天页面)。

  • 示例

    复制代码
    <activity
        android:name=".SystemCallActivity"
        android:launchMode="singleInstance" />
  • 特点:隔离性最强,使用场景极少,避免滥用(会增加任务栈管理复杂度)。

补充:Intent 标志位(动态指定启动模式)

除了在 Manifest 中静态配置,还可通过 Intent 的标志位动态指定启动模式(优先级高于 Manifest 配置),常用标志位:

  • FLAG_ACTIVITY_NEW_TASK:对应 singleTask(需配合 taskAffinity)。
  • FLAG_ACTIVITY_SINGLE_TOP:对应 singleTop。
  • FLAG_ACTIVITY_CLEAR_TOP:配合 singleTask 使用,清除目标实例上方的所有 Activity。
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:Activity 不显示在最近任务列表。

示例代码(动态指定 singleTop):

复制代码
Intent intent = new Intent(this, SearchActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

总结

  1. standard:默认模式,每次新建实例,适合普通页面;
  2. singleTop:栈顶复用,避免栈顶重复创建,适合通知 / 搜索页面;
  3. singleTask:栈内单例,清理上方页面,适合应用核心页面(如首页);
  4. singleInstance:全局单例 + 独立栈,仅用于系统级 / 强隔离页面,极少使用。

核心原则:根据页面的 "复用需求" 和 "任务栈隔离需求" 选择启动模式,优先使用 standard/singleTop/singleTask,避免滥用 singleInstance。

相关推荐
阿巴斯甜30 分钟前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95272 小时前
Andorid Google 登录接入文档
android
黄林晴3 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab16 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿19 小时前
Android MediaPlayer 笔记
android
Jony_19 小时前
Android 启动优化方案
android
阿巴斯甜19 小时前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇19 小时前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android