任务与任务栈
任务就是一系列以栈结构组合起来的acitivity组合。
任务栈就是管理任务中一系列activity的数据结构。
简单来说,我们可以把任务看作一个应用,这个应用由很多的activity组成,这些activity由一个栈进行管理。
比如我们在桌面点开一个应用,如果这个应用第一次打开,系统会给这个应用创建一个任务栈(假设为S1),然后应用默认的mainActivity(假设为A)会压入任务栈中,然后我们在mainActivity中点开一个标准启动模式的secondActivity(假设为B),则secondActivity就又会压入栈中,此时任务栈S1中为AB。然后我们点击返回按钮,任务栈将secondActivity弹出,mainActivity到了栈定,此时任务栈S1中为A。
启动模式
前面说了任务与任务栈,其中提到了标准启动模式,于是又转到了启动模式。
在任务栈S1中的activity1启动了标准启动模式的activity2,系统会创建activity2的实例,并压入任务栈S1中。也就是标准启动模式的activity会添加到发送启动请求的activity所处的那个任务栈中(有点绕口,好好想一想)。但是有时候我们需要为新启动的activity2指定任务栈,或者不重新创建activity2的实例,这样就需要修改activity2的启动模式。
activity的启动模式共有四种:standard模式,singleTop模式,singleTask模式,singleInstance模式。
standard(标准)模式:
标准模式,也是系统默认的模式。处于标准模式的activity,每次启动都会创建新的实例,并且处于发出启动请求的activity所处的任务栈中。
比如:任务栈S1,启动标准模式ActivityA,ActivityA启动标准模式ActivityB,ActivityB启动标准模式的ActivityA,ActivityA启动标准模式的ActivityA,返回,返回
则任务栈S1的变化是: A AB ABA ABAA ABA AB
注意:使用ApplicationContext启动标准模式的acitivity时会保存,因为ApplicationContext不属于任何任务栈,所以导致新启动的acitivity不能获得目标任务栈,导致报错。应使用activity类型的context。
singleTop(栈顶复用)模式
启动singleTop模式的activity时,如果目标任务栈的栈定已经存在该acitivity的实例,则不重新创建,会调用该activity的onNewIntent方法。
比如:任务栈S1,启动singleTop模式ActivityA,ActivityA启动singleTop模式ActivityB,ActivityB启动singleTop模式的ActivityA,ActivityA启动singleTop模式的ActivityA,返回,返回
则任务栈S1的变化是: A AB ABA ABA ABA AB A
singleTask(栈内复用)模式
如果acitivity的启动模式是singleTask时,任务栈中只会存在一个该acitivity的实例。
如果任务栈S1中为ABCD,现在以singleTask模式启动B,B的目标任务栈为S1,则任务栈S1为 AB
如果任务栈S1中为ABCD,现在以singleTask模式启动B,B的目标任务栈为S2,S2不存在,则会创建任务栈S2,然后创建B的实例并压入S2中,S2为B,S1为ABCD
如果任务栈S1中为ABCD,现在以singleTask模式启动D,D的目标任务栈为S1,则任务栈S1为 ABCD
singleInstance(单例)模式
如果activity的启动模式是singleInstance,则activity只会单独地存在于一个任务栈中
activity所需要的任务栈
singleTask和singleTop都有目标任务栈,那么activity的目标任务栈是在哪里定义的呢?
acitivity默认的任务栈的名字都是app的包名,即所有的activity默认都是在一个任务栈中。我们可以使用TaskAffinity为activity修改目标任务栈。TaskAffinity通常和singleTask或者allowTaskParenting一同使用。
singleTask我们之前讲过,allowTaskParenting有点复杂。有两个应用A和B,应用A的activity1启动了应用B的activity2,如果按照标准模式,activity2应该处于应用A的任务栈中,但是如果我们为activity2设置了allowTaskParenting时,被启动的activity2会处于应用B的任务栈中。
网友评论