Activity启动模式
Activity的管理方式:任务栈(先进后出)
一、启动模式
Standard:标准模式。每次启动时都会创建一个新的实例在栈顶。A启动B,B会进入A的栈中并位于栈顶。
- ApplciationContext无任务栈,无法采用标准模式启动Activity,可以为待启动的Activity指定标记位:FLAG_ACTIVITY_NEW_TASK来为其创建一个新任务栈启动。
SingleTop :栈顶复用模式。如果需要新创建的实例就在栈顶,那么就不会去重建,而是复用(调用onNewIntent(),不调用onCreate() 和 onStrat()),否则就重新创建。
SingleTask :栈内复用模式。如果实例在当前栈中已经存在,就会将当前实例上面的其他实例都移除栈,回调onNewIntent(),没有则创建新Activty。
SingleInstance :单例模式。创建Activity时只会创建一个实例,并使用一个全新的栈来装载。SingleTask模式的加强版。
SingleInstancePerTask:Android12新增,默认作用和singleTask相似,不同的在于singleInstancePerTask不需要设置一个不同的taskAffinity即可创建新的Task。
- 结合Intent.FLAG_ACTIVITY_MULTIPLE_TASK和Intent.FLAG_ACTIVITY_NEW_DOCUMENT,每次启动了launchMode设置为“singleInstancePerTask”的Activity都可以创建一个新的Task,那么这个新启动的Activity自然就是这个新创建的Task的root Activity。singleInstancePerTask是singleTask的扩展,这个Activity可以有多个实例,但是每个都是所在的Task的root Activity。
二、设置启动模式
1.AndroidManifest.xml内设置
<activity
android:name=".MainActivity"
android:launchMode="singleInstancePerTask">
</activity>
1.通过Intent设置标志位
val intent = Intent(this,MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
- Intent设置方式的优先级 > Manifest设置方式,即以前者为准
- Manifest设置方式无法设定 FLAG_ACTIVITY_CLEAR_TOP
- Intent设置方式 无法设置单例模式(SingleInstance)