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时,回到手机主界面。如图:
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中。
例如:
“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