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

  • 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实例那么会立即销毁栈。

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的实例。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章