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

前言

重温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实例销毁。cdn

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

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

在standard模式下的Activity的特性是每次启动Activity时都会建立新的Activity实例。好比在栈A中已经存在一个standard模式的Activity_A,此时启动Activity_B,那么栈中的状况就是B-A。若是再次启动A,将会重建A的实例,此时栈中状况是A-B-A。同时按下返回键时会销毁栈顶的Activity,而后将下一个Activity提到前台。若是栈已经不存在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。内存

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

在singleTask模式下Activity主要有可复用的特性,若是栈内存在将要启动的Activity实例那么将复用该Activity实例。好比:在前台的栈中有Activity1和Activity2,在另一个栈中有Activity3和Activity4,其中Activity3是singleTask启动模式,若是启动Activity3,因为栈中存在Activity3的实例,那么将复用Activity3的实例。同时singleTask模式的Activity实例还有栈顶清除特色,那么Activity4的实例将被清除。开发

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

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

Activity的启动标志位

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

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在不一样设置下的行为表现,也能经过使用这些设置来实现所需的功能。

相关文章
相关标签/搜索