1 各个Activity之间是通过Intent连接的,而Android系统,通过栈结构来保存整个App的Activity,栈低的元素是整个任务栈的发起者.
2 当一个App启动的时候,当前环境中没有该App的任务栈,则会创建一个新的任务栈,之后,这个App所启动的所有Activity都将在这个任务栈中被管理,该栈叫Task.即表示若干个Activity的集合,他们的组合形成一个Task,它是一个先进后出的线性表.
注意:一个Task中的Activity可以来自不同的App,同一个App的Activity可能在不同的Task中.
3 Activity在一个Task中的启动模式有两种方法:
3.1 通过在AndroidManifest文件中的属性launchMode来设置.
AndroidManifest的启动模式
- standard
该模式下,每次点击都会创建一个新的Activity覆盖在原来的Activity上. - singleTop
该模式下启动一个Activity时,系统会判断当前栈顶是否是需要启动的这个Activity,若是,则直接复用,不需新建,若不是则会新建,比如qq消息界面,当直接复用这个Activity,系统会调用该Activity的onNewIntent()方法. - singleTask
该模式下启动一个Activity时,系统会判断整个Activity栈中是否有需要启动的Activity,若有,则销毁该Activity以上所有的Activity,将自己置于栈顶.若没有,将会新建一个这样的Activity.
注意:这是指在同一个App中启动这个模式的Activity,其他的程序启动这个模式的Activity的时候,会新建一个任务栈,但是如果这个模式的Activity已经在后台的一个任务栈中了,在启动这个Activity后,后台的任务栈将会一起被切换到前台. - singleInstance
该模式下启动一个Activity时,会新建一个任务栈,而且只保存这一个Activity.
关于sinleTop,sinlegInstance模式的Activity使用startActivityForResult()时,系统直接返回Activity.RESULT_CANCELED,不会再去等待返回.
3.2 通过Intent的Flag来设置 - Intent.FLAG_ACTIVITY_NEW_TASK
使用一个新的Task来启动一个Activity,而且启动的每个Activity都将在一个新的Task.适用于Service中启动一个Activity,因为Service中不存在Activity栈. - FLAG_ACTIVITY_SINGLE_TOP 类似于singletop模式
- FLAG_ACTIVITY_CLEAR_TOP 类似于singleTask模式
- FLAG_ACTIVITY_NO_HISTORY
该模式下启动的Activity再启动其他Activity后,该Activity就消失了,不会在栈中保留.
4 清空任务栈
系统提供了清空任务栈的方法,让我们将一个Task全部清楚,通常是通过AndroidManifeast文件中< activity>标签中的以下属性来设置清楚任务栈.
- clearTaskOnLaunch
在返回该模式下的Activity时,将该Activity之上的所有Activity全部清楚,这个属性,可以让这个Task每次在初始化的时候,都只有这一个Activity.
- finishOnTaskLaunch
通过这个属性,在离开该模式下的Activity所处的Task,那么用户再返回时,该Acitivity就会被finish掉.与clearTaskOnLaunch类似,只是clearTaskOnLaunch是作用与别人身上,而finishOnTaskLaunch是作用于自己.
- alwaysRetainTaskState
该模式下的Activity所在的Task将不接受任何清楚命令,一直保持当前Task状态.