持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
前言
我们了解Activity的启动需要在AndroidManifest.xml(应用清单文件)中声明,但声明时我们还可以自定义Activity的启动模式,这章将分享Activity的四种启动模式。
Activity启动模式
如果在清单文件中声明Activity未指定启动模式时,系统默认设置该Activity启动模式为standard,即标准模式
-
standard(标准模式)
<activity android:name=".XXX.TestActivity" android:launchMode="standard" />-
standard为Activity默认的模式,该模式下Activity每次启动时,不管栈中是否有相应的实例,都会创建一个新的Activity实例入栈。 -
为了方便理解standard模式的Activity在任务栈的启动逻辑,绘制了Activity启动时任务栈的出栈入栈情况图
-
-
singleTop(栈顶复用模式)
<activity android:name=".XXX.TestActivity" android:launchMode="singleTop" />singleTop模式下的Activity启动时,若目前任务栈顶Activity与启动Activity为同一实例时,则不会入栈,调用栈顶Activity中onNewIntent()。- 如果与任务栈顶不为同一实例,则创建新的
Activity实例入栈,不论栈中是否存在同一Activity实例 - (只以栈顶实例来判断是否新建实例还是沿用实例)。
-
singleTask(栈内复用模式)
<activity android:name=".XXX.TestActivity" android:launchMode="singleTask" />singleTask是单实例模式,一个任务栈中同一个Activity只能存在一个实例。就像Map中不能存在两个相同的key。- 在启动
singleTask模式的Activity时,如果任务栈内存在该Activity的实例,程序将会将任务栈中该实例以上的Activity依次出栈,直到该实例处于任务栈最顶层。若任务栈内存中没有该Activity的实例,则创建一个新的Activity实例入栈。
-
singleInstance(全局单例模式)
<activity android:name=".XXX.TestActivity" android:launchMode="singleInstance" />- singleInstance模式的Activity实例只能单独存在于一个任务栈中,新建该实例都会新建一个专属于该实例的任务栈。
动态设置启动模式
除了在清单文件中设置launchMode属性,我们还可以在程序执行中动态设置Activity的启动模式,如果动态设置的Activity启动模式优先级会更高。
Intent intent = new Intent(mTestActivity, TestActivity.class);
// 相当于设置Activity启动模式为 singleInstance
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);