你知道Activity的四种启动模式吗

135 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

前言

我们了解Activity的启动需要在AndroidManifest.xml(应用清单文件)中声明,但声明时我们还可以自定义Activity的启动模式,这章将分享Activity的四种启动模式。

Activity启动模式

如果在清单文件中声明Activity未指定启动模式时,系统默认设置该Activity启动模式为standard,即标准模式

  • standard(标准模式)

       <activity
            android:name=".XXX.TestActivity"
            android:launchMode="standard" />
    
    • standardActivity默认的模式,该模式下Activity每次启动时,不管栈中是否有相应的实例,都会创建一个新的Activity实例入栈。

    • 为了方便理解standard模式的Activity在任务栈的启动逻辑,绘制了Activity启动时任务栈的出栈入栈情况图

  • singleTop(栈顶复用模式)

       <activity
            android:name=".XXX.TestActivity"
            android:launchMode="singleTop" />
    
    • singleTop模式下的Activity启动时,若目前任务栈顶Activity与启动Activity为同一实例时,则不会入栈,调用栈顶ActivityonNewIntent()
    • 如果与任务栈顶不为同一实例,则创建新的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);