一、Android 启动模式LaunchMode
- Standard:标准模式,也是系统默认的启动模式。每次启动都会创建一个新的Activity实例,不管这个实例在栈中是否已经存上。Activity所在的任务栈为启动新Activity B的Activity A所在任务栈。具体就是Activity A所在的任务栈为S1,Activity A启动Activity B,那么Activty B的实例被创建后,会将Activity B的实例压入任务栈S1中。
- SingleTop:栈顶复用模式。在这种启动模式下,如果新Activity已经在任务栈的栈顶,那么,将不会重新创建新Activity,同时onNewIntent(...)方法被回调,通过此方法参数可以获取到请求信息。需要注意的是此Activity的onCreate(...)和onStart(...)方法也不会被调用。比如:有四个Activity,分别为ABCD,Activity D的LaunchMode是SingleTop模式;
- 如果,在任务栈中四个Activity的排列是ABCD的顺序,此时,启动Activity D,由于Activity D位于任务栈栈顶,那么就不会创建Activity D实例,系统会调用Activity D的onNewIntent(...)方法。此时,Activity在任务栈中的顺序依然是ABCD。
- 如果,在任务栈中四个Activity的排列是ADBC的顺序,此时,启动Activity D,由于Activity D没有位于任务栈栈顶,那么,就会创建Activity D的新实例,并压下任务栈中。此时,Activity在任务栈中的顺序是ADBCD。
- SingleTask:栈内复用模式。这是一种单实例模式,在这种模式下,只要Activity在一个任务栈中存在,那么多次启动此Activity都不会创建新的实例,和SingleTop一样,系统会调用其onNewIntent(...)方法。具体一点就是,有一个Activity A,并启动Activity A。首先寻找Activity A所需的任务栈,如果任务栈不存在,则创建任务栈并将Activity A压入栈中。如果Activity A所需的任务栈已经存在,则看Activity A在任务栈中,是否存在实例,如果不存在实例,就会创建新的实例并压入栈中;如果Activity A实例在已经存在的任务栈中,则将Activity A的实例调到栈顶,由于SingleTask有clearTop效果,在Activity A实例之上的所有Activity都会被出栈,直至Activity A到栈顶为止。比如:有四个Activity,分别为ABCD,并且Activity B的launchMode为SingleTask,此时启动Activity B。
- 如果,Activity B所需的任务栈不存在,此时会创建其任务栈S1并将Activity B压入栈中。
- 如果,Activity B所需的任务栈S1已经存在,此时会在任务栈S1中查看Activity B的实例是否在栈中存在。假如,Activity B的实例在任务栈S1中存在,并且当前任务栈中已经存在几个Activity,在任务栈中的排列为ABCD,那么,此时启动Activity B,不会再创建Activity B的实例,系统会调用其Activity B的onNewIntent(...)方法。并且将Activity B调至栈顶,由于SingleTask有clearTop效果,CD两个Activity会被出栈,直至Activity B被调到栈顶。
- 如果,Activity B所需的任务栈S1已经存在,此时会在任务栈S1中查看是否存在Activity B的实例,如果不存在,则在任务栈S1中创建Activity B的实例,并压入任务栈S1中。
- SingleInstance:单实例模式。这是一种加强版的SingleTask模式,它除了具有SingleTask的所有特性外,还加强了一点,就是具有此模式的Activity只能单独位于一个任务栈中。换句话说就是,一个Activity B是SingleInstance模式,在启动Activity B时,会创建Activity B所需的任务栈S2,并将Activity B压入栈中,并且这个任务栈S2,只会有一个Activity,那就是Activity B。由于栈内复用模式,再次启动Activity B时,均不会再创建Activity B的实例,系统会调用Activity B的onNewIntent(...)方法。除非,Activity B所需的任务栈S2被系统销毁,否则不会再创建Activity B的实例。
PS:Android App在创建任务栈时,默认使用的是包名为任务栈名称,当前也可以自定义指定任务栈名称,比如:
1 <activity 2 android:name=".SecondActivity" 3 android:launchMode="singleInstance" 4 android:taskAffinity="com.example.task.task.SecondActivity11" 5 android:allowTaskReparenting="true"/>
其中,属性taskAffinity与allowTaskReparenting是配合使用的,taskAffinity指定任务栈名称。属性taskAffinity只有在SingleTask和SingleInstance模式下有效。