在 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 允许同一栈中存在其他 Activity,singleInstance 独占整个栈。
如何选择启动模式?
根据页面是否需要复用实例和任务栈管理需求决定。优先使用 singleTop 避免栈顶重复,复杂场景用 singleTask。
onNewIntent() 的作用?
在复用 Activity 实例时传递新的 Intent 数据,需在此方法中更新 UI 或逻辑。
通过合理配置启动模式,可以有效管理 Activity 生命周期和任务栈,提升用户体验并优化资源利用。