Activity(活动)的启动模式详解

Activity有四种启动模式:分别是standard,singleTop,singleTask,singleInstance.
在AndroidMenifest中通过给标签设置android:launchMode来给Activity设定启动模式 ,如下图所示:

        <activity  android:name="com.app.mode.B" android:launchMode="singleInstance" />

在一个Android应用中是通过任务(Task)来管理活动的,一个任务是指存放在栈中的所有活动的集合,其中这个栈称为返回栈,也可叫任务栈。在默认的情况下,系统只会创建一个默认的任务栈(栈的名称就是应用程序的包名)来存放所有的活动.然而通过设定android:launchMode就可以创建另外一个任务栈出来。
比如singleInstance模式就会一个新的独立的任务栈,而且只放置一个活动。
singleTask结合TaskAffinity也可以创建出另外一个新任务栈,
而这种新创建的任务栈是不同于系统默认的任务栈。

standard
标准模式,也是系统默认的模式,每启动一个Actiivity都会创建一个新的实例。比如ActivityA是标准模式,那么每次启动一次ActivityA,都会产生一个新的实例。
在这种模式下,若X(Activity)启动了这个Y(Activity,标准模式),那么Y就运行在启动它的X所在的任务栈中。(若X是singleInstance模式除外)。

Activity(活动)的启动模式详解_第1张图片

singleTop
栈顶复用模式。如果新启动的Activity已经存在位于任务栈的栈顶,那么此Activity不会被创建同时会回调它的onNewIntent方法;如果新启动的Activity不存在或者存在但不是位于任务栈的栈顶,那么此Activity任然会重新创建。
在这种模式下,若X(Activity)启动了这个Y(Activity,栈顶复用模式),那么Y就运行在启动它的X所在的任务栈中。(若X是singleInstance模式除外)。
Activity(活动)的启动模式详解_第2张图片

singleTask
栈内复用模式。是一种单实例模式,如果新启动的Activity已经存在于一个任务栈内了,那么多次启动此Activity都不会创建新的实例,同时也会回调它的onNewIntent方法。如果新启动的Activity不存在,就会重新创建一个任务栈并把这个Activity放入栈中。
在这种模式下,若X(Activity)启动了这个Y(Activity,栈内复用模式),这时候要看看Y有没有在标签内设置TaskAffinity(TaskAffinity标识了一个Activity所需要的任务栈的名称)的值。
如果没有设定,Y就运行在X所在的任务栈中(若X是singleInstance模式除外);
若已经设定,Y就运行在另一个任务栈中,而且任务栈的名称是设定的TaskAffinity的值;
补充一下;:TaskAffinity属性只有在singleTask模式下,才有意义,在其他模式下,不起作用。
Activity(活动)的启动模式详解_第3张图片

Activity(活动)的启动模式详解_第4张图片

singleInstance
单实例模式,而且是一种加强了的singleTask模式,具有singleTask模式的所有特性外,还加强了一点那就是此种模式的Activity只能单独位于一个任务栈中。比如ActivityA是singleInstance模式,当ActivityA启动后,系统会为它创建一个新的任务栈,然后A独自运行在这个任务栈中,由于栈内复用特性,后续的请求均不会创建新的实例。
在这种模式下,若X(Activity)启动了这个Y(Activity,singleInstance模式),那么Y就运行在另外一个任务栈中。

Activity(活动)的启动模式详解_第5张图片

你可能感兴趣的:(android,Activity,启动模式)