Android——Activity的四种启动模式
发布日期:2021-05-25 13:00:39 浏览次数:19 分类:精选文章

本文共 2491 字,大约阅读时间需要 8 分钟。

Activity的启动模式及启动方式

activity的启动模式

在Android开发中,activity的启动模式有四种常见模式,可以根据不同需求选择不同的启动方式。本文将详细阐述这四种启动模式,并指导如何在不同场景中使用这些模式。

1. standard启动模式

系统默认使用此启动模式,无论实例是否已经存在,每启动一次都会创建一个新的实例。这种模式适用于大多数简单的场景,例如打开一个新的任务会口。

2. singleTop启动模式

singleTop模式的特点是:在同一个任务栈中,如果已经有一个实例存在,系统会回调onNewIntent事件,而不会创建新的活动实例。这种模式特别适用于需要在任务栈顶部展示内容,但不需要启动新的实例的场景。

需要注意的是,singleTop的启动模式有两种典型场景:

  • 当任务栈中已经有ABCD四个实例,在D中启动一个singleTop模式的实例时,系统会将新的实例放在栈顶,但并不创建新的D实例。
  • 类似地,依然在ABCD任务栈中启动一个singleTop模式的B实例时,如果B已经存在栈中,但位于栈底,那么启动B时会将其移动到栈顶。

这个模式的主要优势在于可以避免不必要的资源消耗,同时保持任务栈的整洁。

3. singleTask启动模式

与singleTop模式相比,singleTask模式具有clearTop特性。这意味着当启动一个singleTask模式的活动实例时,会将栈顶位于该活动之前的所有实例全部清除掉。在ABCD任务栈中启动一个singleTask模式的B实例时,只会保留A和B两个实例,而C和D会被清除。此外,这种模式还带有一些特有的优势,如任务栈不会因为启动新实例而受到其他活动实例的干扰。

4. singleInstance启动模式

singleInstance启动模式是singleTask模式的增强版。它不仅保留了前者的一些优点,还增加了一个关键特性:以单例形式运行,任何启动该模式的activity都必须独立于其他所有任务栈运行。

启动模式的设置方法

单元格文件是首选选择。在AndroidManifest.xml文件中设置launchMode属性,可以实现对activity启动模式的全局管理。

在代码中设置启动模式的方式也是很常见的luetinx:

标签,还有一些额外的标志位可以帮助我们进一步定制启动方式。

如AndroidManifest.xml中设置launchMode属性来导定每个activitfullscreen的启动模式。例如:

此外,我们可以通过动态设置intent的标志位来实现启动模式的灵活配置。例如:

Intent intent = new Intent();intent.setClass(this, MainActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);

如果开发者想混合使用清单文件和动态设置方式,可以通过比较 flags 的设置来确定优先级。

activity常用的Flags

在编写intent时,可以通过设置一些特定的标志位来控制activity的启动行为。这些标志位包括:

  • FLAG_ACTIVITY_NEW_TASK

    [default: false]
    当设置该标志位时,系统会创建一个新的任务栈来启动新的activity。此外,如果不设置该标志位,则会用当前已经存在的任务栈来启动新的activity。与AndroidManifest.xml中的launchMode="singleTask"效果相同。

  • FLAG_ACTIVITY_SINGLE_TOP

    [default: false]
    当设置该标志位时,系统会将新实例推送到栈顶,而不会创建一个新的任务栈。其效果与AndroidManifest.xml中设置launchMode="singleTop"相符。

  • FLAG_ACTIVITY_CLEAR_TOP

    [default: false]
    当设置该标志位时,系统会在同一个任务栈中清除位于当前activity之上的所有实例。这种模式通常与singleTask模式一起使用,如前所述的例子中,启动一个activity会清除上一个活动。

  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

    [default: true]
    设置该标志位后,活动将从最近使用的应用列表中被排除。如同AndroidManifest.xml中设置excludeFromRecents="true"效果一样。

  • 在设置这些标志位时,可以通过合理的组合,实现更复杂的activity启动逻辑。例如在需要启动一个完全独立于现有任务栈的活动时,可以使用如下方式:

    Intent intent = new Intent();intent.setClass(this, MainActivity.class);intent.addFlags(    Intent.FLAG_ACTIVITY_NEW_TASK |    Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);

    注意事项

    在使用这些启动模式时,我们需要注意以下几点事项:

  • 设置优先级:如果同时在清单文件和动态设置intent时,都设置了相关的启动模式标志位,系统会以在清单文件中设置的模式为高优先级。

  • 任务栈管理:在不同的启动模式下,任务栈的管理方式会有所不同。在默认模式下,任务栈会随活动的进入而不断深入;而在singleTask模式下,系统会创建一个新的任务栈或重用现有的任务栈,并清除之前的任务记录。

  • 兼容性问题:某些启动模式可能会影响其他已有应用的行为,因此在开发过程中需要注意对目标设备的兼容性进行充分测试。

  • 通过合理地选择和配置activity的启动模式,我们可以更好地满足不同的应用场景需求,提升应用的运行效率和用户体验。

    上一篇:Android——显示Intent和隐式Intent以及IntentFilter匹配规则
    下一篇:Android——Activity的生命周期

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月02日 06时35分48秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章