Android 启动模式LaunchMode详解(LaunchMode四种模式详解)

1、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在建立任务栈时,默认使用的是包名为任务栈名称,当前也能够自定义指定任务栈名称,好比:android

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模式下有效。spa

相关文章
相关标签/搜索