最近被问到很多次的Activity的启动模式,故专门参考了相关书籍,比如《Android的开发艺术探索》特此做个总结。
首先我们需要知道,在默认情况下,当我们启动同一个Activity的时候,系统会创建多个实例并把它们一一放入到任务栈中(先进后出的栈结构)。但是,像每次创建实例的这样过 程我们并不是很需要,如果只可以创建一次就可以了。于是乎,Android给我们提供了四种启动模式:standard,singleTop,singleTask,singleInstance。
1.standard:标准模式,也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例(不管该实例是否已经存在)。创建实例的过程符合Activity的生命周期(如onCreate,onStrat,onResume)。在这种模式下,谁启动了这个Activity,那么这个Activity的实例就在启动它的Activity的任务栈中。比如,Activity A启动了Activity B,同时Activity A属于任务栈A,则Activity B属于任务栈A。
2.singleTop:栈顶复用模式。在这种模式下,如果当过当前Activity处于栈顶位置,则此Activity不会被重建,同时它的onNewIntent方法(通过此方法的参数我们可以取出当前请求的信息)会被回调。如果该Activity的实例已存在,但不在栈顶,那么新的Activity仍会重建。比如,当前的栈内有ABCD四个实例,D位于栈顶,当重新启动一个D之后,栈内的情况还是ABCD.如果D位于栈底,A位于栈顶,重新启动一个D之后,栈内的情况为DCBAD。
3.singleTask:栈内复用模式。这是一种单实例模式。在这种情况下,只要任何一个栈中存在该Activity的实例,那么多次启动都不会重新创建。详细点说就是,当启动一个Activity A的时候,系统首先会寻找是否存在该A所需要的栈,如果不存在,则创建一个任务栈,并把A的实例放入到栈中。如果存在A所需的栈,然后查看该栈中是否存在A的实例,如果存在,则把A调到栈顶并调用它的onNewIntent方法,如果实例不存在,则创建A的实例,并放入到栈中。
1.如目前任务栈s1中存在ABC三个实例。这个时候Activity D以singleTask模式启动,且需要的任务栈为s2。由于任务栈s2和D的实例都不存在,所以首先会新建s2任务栈,然后 将D的实例放入到s2中。
2.假如将第一种情况中,D的实例所需的任务栈变为S1,则由于s1已经存在,所以系统会直接创建D的实例并放入到s1中。
3.假如D所需的任务栈为s1,且当前的栈中的实例为ADBC(C为栈顶).这种情况下,当启动D的时候,由于栈中已经存在D的实例,所以系统不会重新创建D的实例,并且将D放 置到栈顶位置。由于singleTask默认有clearTop的效果。,所以当前栈中的情况为AD。(B,C已经出栈)
4.singleInstance:单实例模式。这是一种加强的singleTask模式。以此种模式启动的Activity的只能单独的位于一个独立的任务栈中。比如Activity A以该模式启动,则系统会为A创建一个新的任务栈,然后A独立运行在这个任务栈中,由于栈内的复用性,后续的请求均不会创建新的Activity.