首页 > 代码库 > Activity回退栈使用
Activity回退栈使用
当一个APP启动时,系统会为这个APP创建一个回退栈(任务),用于保存APP所有已经创建的额Activity。当应用启动时,主窗口将第一个被压入回退栈,当显示本应用的其他窗口时,也会按显示顺序创建窗口压入回退栈。回退栈的顶层窗口将会获得焦点,可以与用户交互。当执行Activity的finish方法或者按Back键时,顶层窗口将出栈被销毁,下一个窗户获得焦点同用户交互。例如一个APP有3个窗口,分别为:A、B、C,其中A为主窗口,当从A启动B,在从B启动C,从C启动A时,此时回退栈的顺序为AàBàCàA,最顶层和底层都为A,当按Back时,顶层A会出栈销毁,窗口C会获得焦点,在按Back时,C会出栈,以此类推,当最后A出栈了,回退栈会销毁,程序退出,释放相应资源。
在正常情况下,APP没跳转一个窗口,回退栈就会将新建的这个窗口压入进来,但是我们可以通过设置窗口的launchMode属性或者在跳转时设置通话Intent的setFlags()方法设置窗口的启动模式,来改变回退栈默认的压栈操作。
launchMode的属性有四种种分别为: standard、singleTop、singleTask、singleInstance,其中standard为默认的启动模式。
singleTop模式:
当一个Activity的启动模式设置成singleTop时,当其启动时,会检测回退栈的顶端是不是就是这个窗口,如果是,就不会新建窗口压入回退栈,而是直接显示顶层的窗口,并调用其onNewIntent方法。如果定层不是这个窗口,就会新建窗口压入回退栈。例如一个应用有两个Activity(A,B)其中B的启动模式的singleTop,用户执行的操作为,主窗口启动B,B又启动B,执行完这些回退栈的顺序为 AàB,而不是AàBàB。
singleTask模式:
singleTask模式比较复杂些,可以分为如下几种情况,
在同一个应用内,跳转到一个定义为singleTask模式的窗口,会检测回退栈是否已经有该窗口了,如果有,会销毁压在上面的所有窗口,使其在回退栈顶层获取到焦点,并调用该窗口的onNewIntent方法。如果一个应用有三个Activity(A、B、C)其中B的启动方式为singleTask,用户执行操作为:主窗口A启动B,B启动C,C启动B,这时回退栈里窗口顺序为AàB。
如果调用另一个应用的声明为singleTask模式的窗口,如果该窗口存在,会进行回退栈(任务)切换到该窗口所在的任务中。如果该窗口不存在,会心建一个回退栈,并把该窗口压入新建回退栈中,也会将当前任务切换到新建的回退栈来。
singleInstance模式:
singleInstance模式和singleTask模式非常相似,区别就是singleInstance模式新建的回退栈只能包含一个窗口,貌似这种模式非常少用。
使用Intent的setFlags()方法设置窗口的启动模式。常用的有:
Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_CLEAR_TOP
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_CLEAR_TASK
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
Intent.FLAG_ACTIVITY_SINGLE_TOP:与在launchMode设置singleTop是完全一样的。
Intent.FLAG_ACTIVITY_CLEAR_TOP:
当跳转到一个单独使用Intent.FLAG_ACTIVITY_CLEAR_TOP的Activity时,会检测回退栈是否已经有该窗口了,如果有就会清空压在上面的窗口和自己本身,然后在新建一个新的窗口压入回退栈。如果窗口A跳转到B,B跳转到C,C又调转到B(跳转时给Intent设置了Intent.FLAG_ACTIVITY_CLEAR_TOP),此时回退栈顺序为:AàB,并且会执行B的onCreate方法。
当Intent.FLAG_ACTIVITY_CLEAR_TOP与Intent.FLAG_ACTIVITY_SINGLE_TOP
同时使用,就与在launchMode设置singleTask,并跳转到程序内部的窗口的作用是一样的。
Intent.FLAG_ACTIVITY_NEW_TASK:
与在launchMode设置singleTask,并调用其它应用的声明的singleTask的窗口作用是一样的。
Intent.FLAG_ACTIVITY_CLEAR_TASK:
会清除回退栈中的所有窗口,在新建要显示的窗口并压入回退栈中。但必须与
Intent.FLAG_ACTIVITY_NEW_TASK共同使用才有作用。
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
比较有意思,当设置了Intent.FLAG_ACTIVITY_REORDER_TO_FRONT进行跳转时,会检测回退栈是否有该窗口,如果没有,就新建窗口压入回退栈中。如果有,就把该窗口提到回退栈的顶层。例如 窗口A调转到B,B跳转到C,C调转到B(设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT),那么此时回退栈顺序为AàCàB,而不是 AàBàCàB了。
Activity回退栈使用