Activity的LaunchMode

1.standard:标准模式,这是系统默认的模式,每次启动一个activity都会创建一个新的实例,不管这个实例是否存在。每次启动activity,它的onCreate、onStart、onResume都会被调用。需要注意的是在这种模式下,谁启动了这个activity,那么这个activity就运行在启动它的那个activity的任务栈,正是因为这个原因,不能用ApplicationContext(非activity类型的context)来启动此模式下的activity。要想使用ApplicationContext来启动,那必须给待启动的activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动它的时候就会创建一个新的任务栈,实际上此时是以singleTask模式启动。

2.singleTop:栈顶复用模式。在这种模式下,如果activity已经位于任务栈的栈顶,那么此activity不会被重新创建,同时它的onNewIntent方法会回调,通过此方法可以取出当前请求的信息。

3.singleTask:栈内复用模式,这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此activity都不会创建新的实例,和singleTop一样,系统也会回调onNewIntent()方法。启动此模式的activity A时,系统会首先寻找是否存在A所需要的任务栈,如果存在需要的任务栈,再在该任务栈中寻找A的实例,如果该任务栈中存在A实例,那就把A调到栈顶并调用onNewIntent,如果该任务栈中不存在A实例,那么就创建A实例并把它放到该任务栈顶;如果不存在A所需要的任务栈,那就新创建一个任务栈,并把新创的A实例放到栈中。

4.singleInstance:单实例模式。这是一种嘉加强的singleTask模式,它除了具有singleTask所有特性外,还加强了一点,那就是此模式的activity只能单独地位于一个任务栈中。也就是说,当该模式的activity A启动后,系统会为它创建一个任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的实例,除非该独特的任务栈被系统销毁。

TaskAffinity:Activity所需要的任务栈与TaskAffinity(任务相关性)有关,这个参数标识了一个activity所需要的任务栈的名字,默认情况下,所有activity所需的任务栈的名字为应用的包名。可以指定TaskAffinity属性,但不能跟应用包名相同。该属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用。

(1)当TaskAffinity和singleTask启动模式配对使用时,它是具有该模式的Activity的目前任务栈的名字(任务栈名字为TaskAffinity指定的),待启动的activity会运行在名字和TaskAffinity相同的任务栈中。

(2)当TaskAffinity和allowTaskReparenting结合的时候,这种情况比较复杂。举个例子,有应用A和B,A启动了B中的Activity C,然后按Home键返回桌面,再按B的应用图标,此时并不是启动B的主Activity,而是重新显示已经被A启动的C,或者说C从A的任务栈转移到B的任务栈。正常情况下,C是不可能跟A在同一个任务栈的(因为包名不同),所以当B启动后,B会创建自己的任务栈,这时系统发现C原本想要的任务栈已经被创建,所以把C从A的任务栈转移过来。

你可能感兴趣的:(Activity的LaunchMode)