天天看点

Activity启动模式的总结

Activity有四种启动模式:分别是standard,singleTop,singleTask和singleInstance。

提起启动模式,不得不说下任务栈:

任务栈Task,是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。

启动一个Application的时候,系统会为它默认创建一个对应的Task,用来放置根Activity。默认启动Activity会放在同一个Task中,新启动的Activity会被压入启动它的那个Activity的栈中,并且显示它。当用户按下回退键时,这个Activity就会被弹出栈,按下Home键回到桌面,再启动另一个应用,这时候之前那个Task就被移到后台,成为后台任务栈,而刚启动的那个Task就被调到前台,成为前台任务栈,手机页面显示的就是前台任务栈中的栈顶元素。

(1)standard:Android默认启动模式,每次启动Activity,都会创建一个实例,并加到任务栈。在这种模式下,谁启动了这个Activity,则此Activity就运行在启动它那个Activity所在的任务栈中。

(2)singleTop:栈顶复用模式,在此模式下,如果待启动的Activity位于栈顶,则不创建实例,而是回调其onNewIntent的方法(此模式能解决启动延迟情况下,用户多次触发按钮,打开多个Activity的bug)。

(3)singleTask: 栈内复用模式,如果Activity使用这种模式启动时,如果其所需的任务栈已经创建(根据taskAffinity来判断所需任务栈),而该Activity的实例未创建,则创建该Activity,并把该实例压入栈中。如果任务栈未创建,则创建任务栈,并创建实例入栈。如果任务栈和实例均已创建,则此时则会把该实例移到栈顶,实例上面的Activity则被清出栈。

(4)singleInstance:单实例模式,具有此模式的Activity只能单独的位于一个任务栈中,并且此任务栈只有该实例。应用场景:呼叫来电界面。