Task和back stack

一个task就是用户为了完成一个任务时所操作的一组activity。而back stack就是组织这一组activity的方式,从而实现所谓的“无缝连接”。

启动一个task:一般是在手机主界面,点击一个程序图标时,(如果没有该程序的实例)就会新建一个task而该程序的主界面(activity)就是back stack的第一个元素。

接着当当前的activity启动一个新的activity时,新的activity会push到back stack中,而原来的activity会处于stop状态压入back stack,系统会保存它的状态以便返回。如果我们通过返回键回到前一个activity

则当前的activity回pop出back stack,从而被销毁。当pop出最后一个activity时,回到手机主界面。如图:

android中activity添加fragment导致内存泄露问题 android activity stack_实例化



task可以作为一个的整体在前台和后台间切换。比如我们按下hone键,当前的task会被移动到后台,重新点击程序图标移动到前台。

所以说android是一个多任务系统。

back stack 是不会重新排列里面的activity,当我们启动一个已经存在task的activity时,如上图的activity2,则会在back stack栈顶实例化一个activity2‘。不同的task 间也一样

上面提到系统会保存压入back stack 的activity的状态,但我们不应该依赖于系统的这种行为。因为如果当系统内存不够时,系统会选择销毁一些activity来释放内存。这时该

activity的状态信息就不见了,虽然系统仍然会记录该activity在back stack中的位置,但是当再次回到该activity时调用的是oncreat()方法,而不是onresume()方法了。我们

应该通过回调函数onSaveInstanceState()来确保保存我们的activity状态。

规定activity启动时与task的关系

可以在activity清单文件中规定,或者是在startActivity()是传入标志。如果两个方法同时存在,以第二个为主。

方法一:

清单文件中的launchMode属性:

“standard”

默认情况,activity可以被实例化多次,一个task可以有多个该activity的实例,不同task可以有该activity的不同实例

“singleTop”

从名字可以知道,如果该activity处于back stack的顶部时,如果intent要启动该activity,则通过activity的回调函数onNewIntent()启动该activity。如果它不在task Top就和standard一样

“singleTask”

如果没有task保存Activity的实例,则新建一个Task,并把该Activity压入task 中。如果activity在一个task中存在,另一个task启动该activity时,会引已存在的activity(而且是该activity的task被调到前台),也就是说该activity只有一个实例存在一个task中。

例如:

android中activity添加fragment导致内存泄露问题 android activity stack_回调函数_02


“singleInstance”

和singleTask一样,只不过一个activity就是一个task,不会有其它activity。

方法二:

通过startActivity()参数设置

FLAG_ACTIVITY_NEW_TASK:类似singleTask

FLAG_ACTIVITY_SINGLE_TOP:类似singleTop

FLAG_ACTIVITY_CLEAR_TOP:在back stack 在它上面的activity会被pop出去且销毁,然户调用onNewIntent()重新启动该activity。

任务共用性(affinity ):表明一个Activity应该属于哪一个task