Android Activity 的启动模式(Launch Mode)
1. 什么是 Activity 的启动模式?
Activity 的启动模式决定了在启动一个 Activity 时,它在任务栈中的行为。任务栈(Task Stack)是一个先进后出的堆栈结构,管理着应用中的 Activity。通过配置启动模式,我们可以控制 Activity 在任务栈中的实例化和复用行为,从而优化用户体验和应用性能
2. 四种启动模式详解
-
standard
------------------------
| Activity A |
------------------------
| Activity B |
------------------------
| Activity A |
------------------------
这是默认的启动模式。每次启动 Activity 时都会创建一个新的实例,并将其推入任务栈中。
特点:
- 每次启动都会创建新的实例。
- 每个实例都会有一个独立的生命周期。
使用场景:
- 适用于大多数需要多次实例化的 Activity,比如一个普通的详情页面。
示例:
<activity android:name=".StandardActivity"
android:launchMode="standard" />
-
singleTop
如果要启动的 Activity 已经位于任务栈的栈顶,则不会创建新的实例,而是复用栈顶的实例,并调用其 onNewIntent
方法。
------------------------
| Activity A |
------------------------
| Activity B |
------------------------
| Activity A (复用) |
------------------------
特点:
- 如果 Activity 已在栈顶,则复用该实例。
- 否则,创建新的实例。
使用场景:
- 适用于频繁跳转回同一页面的情况,比如通知点击后打开的页面。
示例:
<activity android:name=".SingleTopActivity"
android:launchMode="singleTop" />
-
singleTask
如果要启动的 Activity 在任务栈中已经存在,则会复用该实例,并将其上的所有其他 Activity 移出栈外,同时调用 onNewIntent
方法。
------------------------
| Activity A |
------------------------
| Activity B |
------------------------
| Activity C |
------------------------
| Activity A (复用) |
------------------------
特点:
- 复用任务栈中已有的实例。
- 清除该实例之上的所有 Activity。
使用场景:
- 适用于需要确保某个 Activity 只有一个实例的情况,比如应用的主页面。
示例:
<activity android:name=".SingleTaskActivity"
android:launchMode="singleTask" />
-
singleInstance
这种模式类似于 singleTask
,但它会为该 Activity 创建一个单独的任务栈,并且该栈中只能有这一个 Activity 实例。
独立任务栈:
------------------------
| Activity A (独立) |
------------------------
特点:
- 复用独立任务栈中的唯一实例。
- 该任务栈中只能有这一个 Activity。
使用场景:
- 适用于需要独立任务栈的特殊页面,比如视频播放或电话拨号页面。
示例:
<activity android:name=".SingleInstanceActivity"
android:launchMode="singleInstance" />
3. 如何在 AndroidManifest.xml 中配置启动模式
在 AndroidManifest.xml
文件中可以通过 android:launchMode
属性配置 Activity 的启动模式。
示例:
<application ... >
<activity android:name=".MainActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
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)