重温Android四大组件(二)—Activity的启动模式与标志位

栏目: IOS · Android · 发布时间: 6年前

内容简介:重温Android四大组件的第二篇,主要总结Activity的启动模式以及相关的标志位。Activity启动模式是Activity的一个重要的属性,启动模式决定了Activity在Activity栈的存在的行为。不同的启动模式下的Activity有不同的表现,所以开发者需要搞清楚各个启动模式的特性以及相互之间的区别。在standard模式下的Activity的特性是每次启动Activity时都会创建新的Activity实例。比如在栈A中已经存在一个standard模式的Activity_A,此时启动Acti

前言

重温Android四大组件的第二篇,主要总结Activity的启动模式以及相关的标志位。Activity启动模式是Activity的一个重要的属性,启动模式决定了Activity在Activity栈的存在的行为。不同的启动模式下的Activity有不同的表现,所以开发者需要搞清楚各个启动模式的特性以及相互之间的区别。

Activity的启动模式

  • standard(标准模式):这是系统默认的启动模式。每次启动standard模式的Activity不管在Activity栈中是否存在Activity的实例,都会创建一个新的Activity实例。另外,被启动的Activity会在启动它的Activity所在的栈中存在。

  • singleTop(栈顶复用模式):在这种模式下启动Activity,如果被启动的Activity实例位于当前栈的栈顶,那么将复用栈顶的Activity实例。否则,重新创建一个Activity实例。在上节讲过,如果复用Activity实例,将调用onNewIntent方法,而不是重建Activity。

  • singleTask(栈内复用模式):在这种模式下启动Activity系统会创建新的Activity栈用来实例化Activity实例(默认情况下,Activity会在启动它的Activity栈中实例化)。如果Activity栈中存在Activity实例,就会复用Activity实例,同时从onNewIntent方法开始Activity的生命周期,同时singleTask模式下的Activity带有clearTop的效果,也就是说复用栈中Activity实例的时候会将位于当前Activity实例上面的Activity实例销毁。

  • singleInstance(单实例模式):在这种模式下启动Activity是系统会创建一个新的Activity栈并且这个栈中只存在这一个Activity实例。

standard模式下的Activity在栈中的表现

在standard模式下的Activity的特性是每次启动Activity时都会创建新的Activity实例。比如在栈A中已经存在一个standard模式的Activity_A,此时启动Activity_B,那么栈中的情况就是B-A。如果再次启动A,将会重建A的实例,此时栈中情况是A-B-A。同时按下返回键时会销毁栈顶的Activity,然后将下一个Activity提到前台。如果栈已经不存在Activity实例那么会立即销毁栈。

重温Android四大组件(二)—Activity的启动模式与标志位

singleTop模式下的Activity在栈中的表现

在singleTop模式下Activity的主要特性是可以复用在栈顶的Activity实例。比如栈中已经存在Activity_A和singleTop模式的Activity_B实例,此时如果再次启动Activity_B那么将复用Activity_B的实例,并且Activity_B的生命周期从onNewIntent开始。如果情况颠倒过来,Activity_A的启动模式是singleTop但Activity_A不位于栈顶,那么在启动Activity_A时,将会重新创建Activity_A的实例。此时栈中的情况是A-B-A。

重温Android四大组件(二)—Activity的启动模式与标志位

singleTask模式下启动Activity在栈中的表现

在singleTask模式下Activity主要有可复用的特性,如果栈内存在将要启动的Activity实例那么将复用该Activity实例。比如:在前台的栈中有Activity1和Activity2,在另外一个栈中有Activity3和Activity4,其中Activity3是singleTask启动模式,如果启动Activity3,由于栈中存在Activity3的实例,那么将复用Activity3的实例。同时singleTask模式的Activity实例还有栈顶清除特点,那么Activity4的实例将被清除。

重温Android四大组件(二)—Activity的启动模式与标志位

singleInstance模式下启动Activity在栈中的表现

singleInstance是一种单实例模式,在这种模式下启动的Activity的每次都会创建一个新的Activity栈,并且在栈中创建Activity的实例。

重温Android四大组件(二)—Activity的启动模式与标志位

Activity的启动标志位

Activity的启动标志位有很多,这里分析一些常用的标志位。设置启动模式的标志位:FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_SINGLE_TOP。设置Activity行为的标志位:FLAG_ACTIVITY_CLEAR_TOP。

FLAG_ACTIVITY_NEW_TASK:通过在Intent中加入FLAG_ACTIVITY_NEW_TASK启动Activity时,将在指定的Activity栈中启动Activity,如果栈中已经存在Activity实例,将复用实例,并且调用onNewIntent方法,这个过程跟singleTask模式下的Activity表现相同。

FLAG_ACTIVITY_SINGLE_TOP:通过在Intent中加入FLAG_ACTIVITY_SINGLE_TOP启动Activity时,如果栈顶已经存在Activity实例,将复用Activity实例,并且调用onNewIntent方法。否则将重新创建Activity实例。这个过程跟singleTop模式下的Activity表现相同。

FLAG_ACTIVITY_CLEAR_TOP:如果正在启动的Activity已在当前栈中运行,则不会启动该活动的新实例,而是销毁其上的所有其他活动。如果Activity的启动模式是singleTask,那么将调用onNewIntent方法。如果Activity的启动模式是standard那么会把Activity已经它上面的Activity实例一同销毁,并且重建Activity实例放入栈顶。

Manifest文件中的标志位

在Manifest文件中也有定义Activity的行为的标志位,但是Intent中的标志位的优先级高于Manifest文件中的标志位。

  • lanuchMode:启动模式标志位,可以定义Activity的启动模式。默认为standard模式。

  • taskAffinity:定义Activity的栈,启动Activity时会根据定义的栈名称创建任务栈并且在栈中创建Activity实例。

  • allowTaskReparenting:默认为false。当设置为true的时候,在这种情况下Activity可以从启动它的栈中转移到它原本所在的应用程序的栈中。比如:有两个应用A和应用B,应用B拥有一个该属性设置为true的Activity。在一个应用A调用这个应用B的Activity,然后在打开应用B时,这个Activity会转移到这个应用B的栈中。

  • clearTaskOnLaunch:是否每当从主屏幕重新启动栈时都从中移除根 Activity 之外的所有 Activity —“true”表示始终将任务清除到只剩其根 Activity;“false”表示不做清除。 默认值为“false”。该属性只对启动新栈的 Activity(根 Activity)有意义;对于栈中的所有其他Activity,均忽略该属性。当值为“true”时,每次用户再次启动栈时,无论用户最后在栈中正在执行哪个 Activity,也无论用户是使用返回还是主屏幕按钮离开,都会将用户转至栈的根 Activity。

  • alwaysRetainTaskState:系统是否始终保持 Activity 所在任务的状态 —“true”表示保持,“false”表示允许系统在特定情况下将任务重置到其初始状态。 默认值为“false”。该属性只对任务的根 Activity 有意义;对于所有其他 Activity,均忽略该属性。正常情况下,当用户从主屏幕重新选择某个任务时,系统会在特定情况下清除该任务(从根 Activity 之上的堆栈中移除所有 Activity)。系统通常会在用户一段时间(如30分钟)内未访问任务时执行此操作。不过,如果该属性的值是“true”,则无论用户如何到达任务,将始终返回到最后状态的任务。 例如,在网络浏览器这类存在大量用户不愿失去的状态(如多个打开的标签)的应用中,该属性会很有用。

总结

上面介绍了Activity的启动模式、标志位以及Manifest文件中的标志位。通过学习这些内容可以掌握Activity在不同设置下的行为表现,也能通过使用这些设置来实现所需的功能。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learning PHP, MySQL, and JavaScript

Learning PHP, MySQL, and JavaScript

Robin Nixon / O'Reilly Media / 2009-7-21 / USD 39.99

Learn how to create responsive, data-driven websites with PHP, MySQL, and JavaScript - whether or not you know how to program. This simple, streamlined guide explains how the powerful combination of P......一起来看看 《Learning PHP, MySQL, and JavaScript》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具