Android基础学习笔记:Activity的四种LaunchMode

      LaunchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task。task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。

Activity一共有以下四种launchMode:

      1.standard;

      2.singleTop;

      3.singleTask;

      4.singleInstance。

1.standard

        这是Activity默认的启动模式,也是最简单的启动模式,standard模式允许在一个Task中拥有多个Activity的实例。如果我们多次启动同一个Activity,那么每次都会重新生成一个该Activity的实例,并放置在该Task的顶部。当按Back键时,会一个一个地将该Activity的实例出栈。如A->A->A……(A表示一个Activity的实例)。

2.singleTop

       singleTop和standard模式,都会将intent发送新的实例(后两种模式不发送到新的实例,如果已经有了的话)。不过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

       singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。如果是A Activity跳转到B Activity,再跳转到A Activity,行为就和standard一样了,会在B Activity跳转到A Activity的时候创建A Activity的新实例,因为当时的栈顶不是A Activity实例。

3.singleTask

        官方文档说明如下:The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to existing instance through a call to its onNewIntent()method, rather than creating a new one. 

       简单来说就是在启动一个singleTaskActivity实例时,如果系统中已经存在这样一个实例,就会将这个实例调度到任务栈的栈顶,并清除它当前所在任务中位于它上面的所有Activity。注意的是该Task中并不是永远只有这个标记为singleTaskActivity,也可以有其他Activity。这只是表面现象,其实我们忽视了一个很重要的属性:taskAffinity

如从Activity  A跳转Activity  B

        AtaskAffinity如果在不设置的情况下默认是包名,BtaskAffinity如果设置为com.launchmode.b(假设跟包名不同)。当A启动B时,如果B的启动模式为“singleTask”,framework会将它的启动标志设为FLAG_ACTIVITY_NEW_TASK。由于BtaskAffinitycom.launchmode.b,那么framework会检索是否已经存在了一个taskAffinitycom.launchmode.b的任务。

1)如果存在taskAffinity相同的任务,则检查在这个任务中是否已经有了一个B实例,如果已经存在一个B实例,则会重用这个任务和任务中的B实例,将这个任务调到前台,清除位于B上面的所有Activity,显示B Activity,并调用BonNewIntent();如果不存在B的实例,会在这个任务中创建B的实例,并调用onCreate()方法。

 

2)如果不存在taskAffinity相同的任务,则会创建一个新的taskAffinitycom.launchmode.b

的任务,并且将B在这个新的任务中启动。

4.singleInstance

        官方文档说明如下:Same as "singleTask", except that the system doesn't launch any other activities into the task holding the instance. The activity is always the single and only member of its task. 

        以singleInstance模式启动Activiyt时,如果已经存在了一个实例(该任务中只有这一个Activity实例),那么会把它所在的任务调度到前台,重用这个实例。如果不存在,会开启一个新任务,并在这个新任务中启动这个singleInstance模式的Activity的一个实例。注意的是该Task中永远只有这一个标记为singleInstanceActivity,它是该Task的唯一成员,不可以有其他Activity


你可能感兴趣的:(Android基础学习笔记:Activity的四种LaunchMode)