From Google官网:理解可能有错,希望被指出,谢谢啦!!
一个任务对应一个栈,栈中可能存在多个Activity
正常不做任何设置,你的Activity跳转应该是下图所示:
相同的Activity默认是会再创建一个实例,而不是复用,如下图的HomeActivity(创建了2个实例)
通常有2种方式设置Activity的启动模式:
1.在AndroidMainfest <Activity>标签中加入属性launchMode:
1.standard(默认就是这个)
2.singleTop 讨论这个前提是在一个任务中的,假设我的activity b启动模式是singleTop的,如果出现类似于a-b 然后我再启动b的时候将仍然是a-b而不是a-b-b,如果是b-a,我再启动b时,则会是b-a-b.(还是创建了一个)
3.singleTask 假设我有个activity b是singleTask模式,首先如果分离的任务中不存在b,那么将建立一个新任务,然后将b作为该任务的根,也就是在该任务的栈底,反之如果有一任务栈中已经存在b,b所在任务栈中之前的activities都将被清掉,之后的全部被带进来.
4.singleInstance 除了包含singleTask一些性质外,singleInstance还有一个重要的特点,就是它所处的任务栈中只有它一个实例。
2.设置Intent的Flag,主要有3种Flag
1.FLAG_ACTIVITY_NEW_TASK 这个作用与singleTask模式一样。
2.FLAG_ACTIVITY_SINGLE_TOP 这个作用与singleTop模式一样。
3.FLAG_ACTIVITY_CLEAR_TOP 讨论这个前提是在一个任务栈中的,假设B是以这个标志启动的,比如A-B-C-D 我在启动B最后结果将是A-B,C-D会被清掉。
关于任务的栈:
当你的任务栈被置于后台的时候,过了一定量的时间,系统会把你这个任务栈中的Activities清得只剩下根Activity,因为它认为用户已经“遗弃了”。
当然你可以修改这种默认行为,通过在<Activity>标签里加入属性:
1.alwaysRetainTaskState 这个属性加入到你根Activity上,即便你的任务在后台,系统也尽量保存你整个任务状态,当然我们这里不讨论资源紧张的时这种特殊情况。
2.clearTaskOnLaunch 这个属性加入到你根Activity上,效果于前面的相反,Task将被清光,即便离开只是一小会。
3.finishOnTaskLaunch 这个属性跟上一个类似,不过他针对是单个Activity.(没试过)
总结:
singleTask和singleInstance都会创建一个新的Task,我们使用应该只用在启动的activity有一个action Main和category launcher的时候,也就是启动另外一个程序的时候。
之所以这么说是因为,假设一个任务栈A-B 然后B启动C的时候使用singleTask,C就处于一个新的任务栈中,当用户在C上操作了好长一段时间,你的A-B这个任务栈可能会被系统回收掉,那时候你再按HOME键,就会丢失了C,因为C不代表这个APP。(这个是我的理解,可能有错)。
鉴于此,如果你要使用的话,比如像C这种情况,既然我找不到了,那我就不希望它还活着,就可以在C activity标签里加入finishOnTaskLaunch.