Android视图手册之启动模式

第三篇 启动模式

启动模式是Android整体知识中比较容易理解的,虽然启动模式很多开发者都知道,但实际却往往会忽略使用,因此善于选择一个对应情况的启动模式来启动Activity,能够让我们的应用以最好的状态来适应各类场景,同时能够让我们能够在使用Activity时,能够通过栈内复用等方式来降低使用压力。

概述

当Activity被初始实例化的方式生成后,是以栈内元素的形式存在在任务栈中,而不同的启动模式,也代表着Activity和栈之间不同的行为关系,如栈内是否复用Activity的实例(SingleTop),Activity是否和其他Activity共存于同一个栈中等。这些不同的模式,也提供给了我们更多调用Acitivity的可能。

任务栈

这里的任务栈(Task),本身其实就是一个栈结构,只不过里面存放的实例对象为Activity,而栈结构本身的特点就是后进先出。Android系统通过任务栈可以按规范管理其中的Activity。存于任务栈中的Activity依然保留其状态信息,因此我们从任务栈中取出该Actvity进行交互时,仍能看到之前的交互状态(返回上一个Activity或后台回到前台)。当我们启动一个Activity时,如果此时App里没有任务栈时,会先创建一个任务栈,并把它的实例放入栈顶,新启动的Activity只有位于栈顶时才会和用户进行交互。当一个新的Activity被创建,就会把原先的Actvity挤入栈内(前提是未销毁),虽然依然保留在栈中,原先的Activity却处于停止状态中。其中如果想让任务栈销毁,需要退出里面所有的Activity才会销毁。
Tips:同一个App中可能存在不止一个任务栈,一个Task中的Actvity可以是App的。如下文介绍的由SingleInstance创建的Activity实例就是独自占有一个任务栈,而当我们应用内跳转三方应用指定路径的Actvity(如系统设置),这里因需跳转生成的实例,如果是Standard模式就会压入我们已存在实例的任务中。
在这里插入图片描述
如图,就是一个存放Activity的任务栈,他们依次跳转的顺序为 Activity1➡Activity2➡Activity3,而只有位于栈顶Activity3是目前和用户进行交互的Activity。

taskAffinity属性

taskAffinity属性:可指定Activity的任务栈的名称,默认任务栈的名称为包名,并且必须包含.
通过设置taskAffinity 我们可以指定对应Activity在哪个任务栈。通过使用adb shell dumpsys activity activities命令查看任务栈信息。

启动模式

启动模式指定

对于启动模式,我们可以到AndroidManifest里进行配置launchMode指定声明(标准模式可以不指定),声明后就会根据指定的模式进行跳转和创建Activity。如下即是栈内复用模式 SingleTask 的声明。

        <activity android:name="..activity.MainActivity" android:launchMode="singleTask"/>

Standard 标准模式

在这里插入图片描述

标准模式是系统的默认模式(可以不指定),在这样模式下,每启动一个Activity都会重新创建一个Activity的新实例,并且将其加入任务栈中,而且完全不会去考虑这个实例是否已存在。
如上图可知,Activity2就是一个声明为标准模式的Activity,当我们每次要跳转到Activity2的时候,它就会重复进行创建实例。
使用场景:像一些资讯信息界面,视频播放时带有右侧的推荐列表的页面,通过不同参数展示不同场景,且不能销毁原Activity时就可以考虑用标准模式。

SingleTop 栈顶复用模式

在这里插入图片描述

在栈顶复用模式中,如果栈内没有创建过Activity实例,它就会创建一个实例放入栈顶,当栈顶已经有创建过的Activity时,就会直接复用栈顶的Activity,如若不在栈顶就不会复用,还是会创建一个实例放入。
如上图可知,Activity2就是一个声明为栈顶复用模式的Activity,它会根据栈顶是否已存在自己的实例选择创建还是复用。当栈顶有实例时就会复用,栈顶无实例时就会重新创建一个实例。
使用场景:当进入的页面往往在不会立刻重复创建的,避免用户因为快速点击交互界面创建了多个该页面时,可以考虑使用栈顶复用模式。

SingleTask 栈内复用模式

在这里插入图片描述

在栈内复用模式中,如果要创建的Activity已经处于栈中时,此时不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity所有销毁,使它成为栈顶。
如上图可知,Activity2就是一个声明为栈内复用模式的Activity,它会根据栈内是否已存实例选择创建还是复用。当栈顶没有实例时就会创建实例,栈顶有实例时就会复用该实例,并把该实例上方的Activity全部弹出。
使用场景:一般用于页面直接返回,并舍弃中间操作页面的情况。

SingleInstance 单实例模式

在这里插入图片描述

在单实例模式中,申明为singleInstance的Activity会出现在一个新的任务栈中,而且这个任务栈只会存在一个Activity。另外单实例模式保留了所有SingleTask模式的特性。值得注意的是,具有此模式的Activity仅仅能单独位于一个任务栈中。
如上图可知,Activity2就是一个声明为单实例模式的Activity,在整个App中是独立在一个栈中的。
使用场景:一般单实例模式的Activity,可在Android系统中被其他应用进行唤起,如锁屏页,往往只存在一个。

Flags指定

除了上述的,到到AndroidManifest里进行启动模式的声明,也可以动态通过指定Flags的方式进行跳转,使用方式如下:

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

当进行用Flags进行指定后,以Flags作为主要的启动模式,目前可用的基本标志位为以下几种:

  • FLAG_ACTIVITY_NEW_TASK
    SingleTask启动模式效果一致,

  • FLAG_ACTIVITY_SINGLE_TOP
    SingleTop启动模式效果一致,AndroidMainfest

  • FLAG_ACTIVITY_CLEAN_TOP
    启动时会将与该Activity在同一任务栈的其他Activity出栈。一般与SingleTask启动模式一起出现。

  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    具有此标记位的Activity不会出如今历史Activity的列表中,使用场景:当某些情况下我们不希望用户通过历史列表回到Activity时,此标记位便体现了它的效果。我们同样可以通过AndroidMainfest进行该属性的配置:

android:excludeFromRecents="trure"

小知识

onNewIntent()

onNewIntent是生命周期里回调的一个方法,当我们希望在OnCreate不被触发的前提下对Intent进行操作,onNewIntent()就是一个不错的方法。
在这里插入图片描述
关于生命周期想要更加熟知的,可以去本文系列的第一章进行了解。
如上图可知,onCreate() 和 onNewIntent() 不会被同时调用。如果Activity已经处于任务栈中,也就是说之前打开过的Activity,现在处于onPause、onStop状态的话,其他应用再发送Intent的话,生命周期执行顺序为onNewIntent,onRestart,onStart,onResume。在启动模式中仅与singleTask,singleTop,singleInstance有关。本身是在栈中判断是否存在该实例,如果存在(singleTop需在栈顶),就会回调到该方法。
启动模式为singleTop:如果栈顶的实例不是该Activity的实例,它会创建一个该Activity的实例,并启动onCreate函数。如果栈顶已经存在该实例,不会执行onCreate函数,而是执行onNewIntent函数来重新启动已经存在的实例。

启动模式为singleTask|singleInstance:如果栈顶不存在该Activity的实例的时候,系统会在栈中寻找是否存在这个实例,如存在的话就会把这个实例放在栈顶,并把它之前的实例清除掉。否则就会执行onNewIntent函数。

可能遇到的相关问题

1、Android的启动模式有几种?
Standard,singleTop,singleTask,singleInstance。
2、这几个启动模式有什么区别?
就上面文章内容进行概述。

面试技巧之简历投递

在我们寻找工作的过程中,可以通过多种途径进行自我展示包括以下一些途径:

  • boss直聘
  • 智联招聘
  • 钉钉
  • 实习僧(实习向)
  • 人才网
  • csdn招聘
  • 牛客网
  • 公司官网
  • 超级简历
  • 内推

其中内推是一种较为不错的入门方案,许多大厂也以内推作为大部分员工的筛选流程。如果觉得自己的简历不够整洁美观,推荐可以到超级简历里面进行初步排版,会给你的简历形象大大加分,所以在忧虑该如何投递简历的旁友们,可以快快行动起来了。

猜你喜欢

转载自blog.csdn.net/number_cmd9/article/details/125303999