Activity 的启动模式决定了在启动一个 Activity 时,它在任务栈中的行为。任务栈(Task Stack)是一个先进后出的堆栈结构,管理着应用中的 Activity。通过配置启动模式,我们可以控制 Activity 在任务栈中的实例化和复用行为,从而优化用户体验和应用性能
standard
------------------------
| Activity A |
------------------------
| Activity B |
------------------------
| Activity A |
------------------------
这是默认的启动模式。每次启动 Activity 时都会创建一个新的实例,并将其推入任务栈中。
特点:
使用场景:
示例:
singleTop
如果要启动的 Activity 已经位于任务栈的栈顶,则不会创建新的实例,而是复用栈顶的实例,并调用其 onNewIntent
方法。
------------------------
| Activity A |
------------------------
| Activity B |
------------------------
| Activity A (复用) |
------------------------
特点:
使用场景:
示例:
singleTask
如果要启动的 Activity 在任务栈中已经存在,则会复用该实例,并将其上的所有其他 Activity 移出栈外,同时调用 onNewIntent
方法。
------------------------
| Activity A |
------------------------
| Activity B |
------------------------
| Activity C |
------------------------
| Activity A (复用) |
------------------------
特点:
使用场景:
示例:
singleInstance
这种模式类似于 singleTask
,但它会为该 Activity 创建一个单独的任务栈,并且该栈中只能有这一个 Activity 实例。
独立任务栈:
------------------------
| Activity A (独立) |
------------------------
特点:
使用场景:
示例:
在 AndroidManifest.xml
文件中可以通过 android:launchMode
属性配置 Activity 的启动模式。
示例:
除了在 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)