Activity 启动模式详解及使用场景

    在 Android 中,Activity 启动模式(Launch Mode) 决定了 Activity 实例如何与任务栈(Task)交互,主要用于控制 Activity 的创建和复用逻辑。Android 提供了四种启动模式,通过 android:launchMode 属性或 Intent Flags 配置。以下是详细说明及使用场景:

1. standard(默认模式)

行为:

    每次启动 Activity 都会创建一个新的实例,无论任务栈中是否已存在该 Activity。

示例:

    启动 ActivityA → ActivityA → ActivityA,任务栈中存在三个 ActivityA 实例

生命周期:

    每次创建新实例时,依次调用 onCreate() → onStart() → onResume()

使用场景:

    普通页面跳转,无需复用实例(如列表页跳详情页)

    需要多个相同 Activity 实例的场景(如多窗口聊天界面)

2. singleTop(栈顶复用模式)

行为:

    若目标 Activity 已在栈顶:直接复用该实例,调用 onNewIntent(),不创建新实例。

    若目标 Activity 不在栈顶:创建新实例

生命周期:

    复用栈顶实例时,调用 onNewIntent() → onResume()

代码示例:

<activity android:name=".DetailActivity" android:launchMode="singleTop" />

使用场景:

    防止快速点击重复打开同一页面(如支付确认页)

    通知栏点击跳转时避免重复创建实例

3. singleTask(栈内单例模式)

行为:

    若任务栈中存在目标 Activity 实例:清除该实例之上的所有 Activity,使其成为栈顶,并调用 onNewIntent()。

    若不存在:创建新实例,并放入当前任务栈(或根据 taskAffinity 匹配的栈)。

生命周期:

    复用实例时,调用 onNewIntent() → onResume();被清除的 Activity 会触发 onDestroy()。

代码示例:

<activity android:name=".MainActivity" android:launchMode="singleTask" />

使用场景:

    应用主页(如首页),确保返回时回到主页并清理其他页面

    登录页,登录成功后跳转主页并清除所有中间页

4. singleInstance(全局单例模式)

行为:

    目标 Activity 独占一个任务栈,且该栈中只能有这一个 Activity

    再次启动时,直接复用该实例(无论从哪个应用启动),调用 onNewIntent()

生命周期:

    复用实例时,调用 onNewIntent() → onResume()

代码示例:

<activity android:name=".SplashActivity" android:launchMode="singleInstance" />

使用场景:

    独立运行的功能(如系统相机、拨号界面)。

    与其他应用共享的 Activity(如地图选点功能)。

任务栈(Task)与 taskAffinity

taskAffinity:

    每个 Activity 的“任务栈归属标识”,默认与应用的包名一致。

    可通过 android:taskAffinity 指定自定义值,通常与 singleTask 或 singleInstance 配合使用。

示例场景:

<!-- 将支付页绑定到独立的任务栈 -->
<activity
    android:name=".PaymentActivity"
    android:launchMode="singleTask"
    android:taskAffinity="com.example.payment" />

    Intent Flags 与启动模式的关系
    通过 Intent Flags 动态控制启动行为(优先级高于 android:launchMode):

    FLAG_ACTIVITY_NEW_TASK
    类似 singleTask,但依赖 taskAffinity 寻找或创建新栈

    FLAG_ACTIVITY_SINGLE_TOP
    等价于 singleTop

    FLAG_ACTIVITY_CLEAR_TOP
    若目标 Activity 已存在栈中,清除其上的所有 Activity

总结对比表

启动模式 实例数量 任务栈规则 典型场景
standard 多个 默认栈,允许重复 普通页面跳转
singleTop 栈顶唯一 复用栈顶实例,避免重复创建 防止快速重复打开
singleTask 栈内唯一 清除上方 Activity,复用实例 主页、登录页
singleInstance 全局唯一 独占独立任务栈 独立功能(如相机、拨号)

常见问题

singleTask 和 singleInstance 的区别?

    singleTask 允许同一栈中存在其他 ActivitysingleInstance 独占整个栈。

如何选择启动模式?

    根据页面是否需要复用实例任务栈管理需求决定。优先使用 singleTop 避免栈顶重复,复杂场景用 singleTask

onNewIntent() 的作用?

    在复用 Activity 实例时传递新的 Intent 数据,需在此方法中更新 UI 或逻辑。

通过合理配置启动模式,可以有效管理 Activity 生命周期和任务栈,提升用户体验并优化资源利用。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容