Activity任务栈的使用(启动模式介绍)

Android 任务栈简介

android应用程序通常会被拆分为多个activity,各个activity之间通过Intent进行连接,而android系统通过栈结构保存整个app的activity。合理的任务栈可以提高程序的性能。当一个app启动时,如果环境中不存在改app的任务栈,那么系统就会创建一个任务栈,此后,这个app所启动的activity都将在这个任务栈中被管理,这个栈也被称为一个Task,需要注意的是,一个任务栈(Task)中的Activity可以来自不同的App,同一个App的Activity也可能不在一个任务栈(Tadk)中。
关于栈结构是一个先进后出 线性表。正常情况下,当一个Activity启动时,新启动的Activity就会置于任务栈的顶端,并处于活动状态,启动他的Activity依然保留在任务栈中,处于停止状态,当用户按下返回键或调用finish()方法时,系统会移除任务栈顶端的Activity,让后面的Activity恢复活动状态。当然也有一些特殊的启动模式会打破这样的一个启动规律,就是我们接下来要介绍的AndroidMainifest启动模式:

AndroidMainifest启动模式

    Android开发者在AndroidMainifest文件中一共设计了四种启动模式。如下:
- standard           
- singleTop              
- singleTask
- singleInstance

standard

默认的启动模式,如果不指定Activity的启动模式,系统默认使用standard启动模式,这种模式每次启动Activity都会创建新的实例,新创建的Activity会覆盖在原来的Activity上。
standard启动模式

singleTop

如果启动模式是singleTop模式,系统在启动Activity时就会判断当前栈顶的Activity是不是要启动的Activity,如果是,则不创建新的Activity而直接引用这个Activity,如果不是则创建新的Activity。这种启动模式在判断栈顶是当前的Activity时,虽然不会创建新的实例,但是系统仍然会在Activity启动时调用onNewIntent()方法,
singleTop模式

singleTask

singleTask启动模式与singleTop模式类似,他们之间的区别是singleTop判断的是当前栈顶元素是否是需要启动的Activity,而singleTask是检测整个Activity栈中是否存在当前需要启动的Activity,如果存在,则将该Activity置于栈顶,并将该Activity以上的Activity全部销毁,这里是指同一个App中启动这个singleTask的Activity,如果是其他程序以singleTask模式来启动这个Activity,那么他将创建一个新的任务栈。
singleTask
需要注意的是,如果启动模式为singleTask的Activity已经在后台的一个任务栈中了,那么启动后,后台的这个任务栈将一起被切换到前台。如图:
singTask启动模式特例

singleInstance

声明singleInstance这种启动模式的Activity在启动时会出现在新的任务栈中,而且该任务栈中只存在这一个Activity,比如应用A的任务栈中创建了MainActivity实例,且启动模式为singleInstance,如果应用B也要激活MainActivity,则不需要创建MainActivity的实例,两个应用共享该Activity实例,这种启动模式通常应用于需要与程序分离的界面。

singleInstance

说明:如果在一个singTop 或者singleInstance的ActivityA中通过startActivityForResult()方法来启动另一个ActivityB,那么系统将会直接返回 Activity.RESULT_CANCELED 而不会再去等待返回。这是由于系统在Framework层做了对这两种启动模式的限制,Android开发者认为,不同的Task之间,默认是不能传递数据的。如果一定要传递数据,只能通过Intent来绑定数据。

设置启动模式

设置启动模式的方法有两种
- 通过在AndroidMainifest文件中的属性 android:launchMode 来设置Activity的启动模式
- 通过设置Intent的Flag来设置一个Activity的启动模式

    - Intent.FLAG_ACTIVITY_NEW_TASK
    创建一个新的Task来启动一个Activity,但启动的每个Activity都将在一个新的Task中,该Flag通常使用于从service中启动Activity的场景。

    - Intent.FLAG_ACTIVITY_SINGLE_TOP
     使用singletop的模式来启动一个Activity

    - Intent.FLAG_ACTIVITY_CLEAR_TOP
    使用singleTask模式来启动一个Activity

    - Intent.FLAG_ACTIVITY_NO_HISTORY
    使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就会消失,不会保留在Activity栈中。
    如A-B,B以这种模式启动C,C启动D,则当前Activity栈中只有ABD。

清空任务栈

系统同样提供了清空任务栈的方法来让我们将一个Task全部清除,通常情况下,可以在AndroidMainifest文件中的标签中使用以下几种属性来清理任务栈

- clearTaskOnLaunch
clearTaskOnLaunch在每次返回该Activity时,都将该Activity之上的所有Activity都清除。

- finishOnTaskLaunch
 通过这个属性,当离开这个Activity所处的Task时,那么用户在返回时,该Activity就会被finish掉

- alwaysRetainTaskstate
如果将Activity的这个属性设置为true,那么该Activity所在的Task将不接受任何清理命令,一直保持当前Task状态。

Android群英传笔记

猜你喜欢

转载自blog.csdn.net/zhu522959034/article/details/79003847