在 Android 开发中,Activity
的启动模式(Launch Mode)定义了当启动一个 Activity
时,系统会如何处理它的实例。不同的启动模式可以影响 Activity
在任务栈中的管理方式,对用户的使用体验产生直接影响。下面详细介绍四种主要的启动模式:
1. standard 模式
- 描述:这是默认的启动模式,每次启动 Activity 时都会创建一个新的实例,不管任务栈中是否已经存在该 Activity 的实例。
- 适用场景:适用于不需要重用的界面,每次启动时都希望展示新的内容。
<activity android:name=".MyActivity"
android:launchMode="standard" />
示例
// 每次调用都会启动一个新的实例
val intent = Intent(this, MyActivity::class.java)
startActivity(intent)
- 栈行为:每次调用 startActivity(),都会将新的 Activity 放在栈顶。多个实例可以同时存在。
2. singleTop 模式
- 描述:如果新启动的 Activity 已经位于任务栈的栈顶,则不会创建新的实例,而是复用现有实例。如果不在栈顶,则会创建新实例。
- 适用场景:适合在某些情况下避免重复启动同一个 Activity,比如点击通知多次打开同一界面。
<activity android:name=".MyActivity"
android:launchMode="singleTop" />
示例
// 如果MyActivity已经在栈顶,那么不会创建新的实例,而是复用已有的实例
val intent = Intent(this, MyActivity::class.java)
startActivity(intent)
- 栈行为:当该 Activity 已经在栈顶时,不会创建新实例,而是调用现有实例的 onNewIntent() 方法。
3. singleTask 模式
- 描述:如果在任何任务栈中已经存在该 Activity 的实例,则不会创建新的实例,而是将其带到前台,并清除其上方的所有其他 Activity。
- 适用场景:适合需要独占任务栈的 Activity,如主页或单一功能页面。
<activity android:name=".MyActivity"
android:launchMode="singleTask" />
示例
// 启动MyActivity时,如果已存在该实例,会清除其上方所有Activity
val intent = Intent(this, MyActivity::class.java)
startActivity(intent)
- 栈行为:若栈中已有该 Activity 实例,则直接将该实例带到前台并清除其上方的所有 Activity。如果不存在,则创建新的实例。
4. singleInstance 模式
- 描述:此模式会为该 Activity 创建一个专属的任务栈。在任何任务中只能有一个实例存在,每次启动时都会复用该实例。
- 适用场景:用于需要独占一个任务栈的 Activity,通常用于特殊功能,如浮动的 Activity 或全屏显示的 Activity。
<activity android:name=".MyActivity"
android:launchMode="singleInstance" />
示例
// 启动MyActivity时,它会运行在独立的任务栈中,且不会创建新实例
val intent = Intent(this, MyActivity::class.java)
startActivity(intent)
- 栈行为:该 Activity 始终处于独立的任务栈中,任何启动请求都会直接复用该实例,不会创建新的实例。其他应用也可以启动这个 Activity,但只能通过其单一实例。
小结
启动模式 | 新实例条件 | 复用条件 |
---|---|---|
standard | 每次启动都会创建新的实例 | 无法复用 |
singleTop | 栈顶没有实例时创建新的实例 | 栈顶已有实例时复用,调用 onNewIntent() |
singleTask | 任务栈中不存在实例时创建新的实例 | 任务栈中存在时,复用并清空其上方 Activity |
singleInstance | 独立栈中不存在实例时创建 | 任务栈中存在时直接复用 |
以上是 Android 中四种 Activity
启动模式的详细说明,根据需要选择合适的模式来优化用户的导航体验和应用的任务管理。