Activity的启动模式

Activity的启动模式

Activity的LaunchMode

standard标准模式
系统的默认模式,每次启动都会重新创建一个新的实例。
standard模式的Activity默认会进入启动它的Activity所属的任务栈中,在使用ApplicationContext去启动standard模式的Activity的时候会运行时异常。解决这个问题的方法是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候就会为它创建一个新的任务栈,这个时候待启动Activity实际上是以singleTask模式启动的。

singleTop栈顶复用模式
如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。这个Activity的onCreate、onStart不会被系统调用,因为他们没有发生改变。如果新Activity的实例已经存在但是不在栈顶,那么新Activity仍然会重新创建。

singleTask栈内复用模式
只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,系统会回调onNewIntent方法。当一个具有singleTask模式的Activity请求启动后,系统会首先寻找此Activity所需要的任务栈,如果需要的任务栈不存在,就重新创建一个任务栈,然后创建Activity的实例后把Activity放入栈中;如果存在Activity所需要的任务栈,并且Activity的实例存在,则把Activity调到栈顶并调用onNewIntent方法,如果实例不存在,就创建Activity的实例并把Activity放入栈中。

  • 例如目前任务栈S1中的情况为ADBC,这个时候Activity D以singleTask模式请求启动,所需的任务栈为S1,根据站内复用原则,D不会被重新创建,系统会把D切换到栈顶,并调用其onNewIntent方法,同时由于singleTask默认具有clearTop效果,会导致栈内所有在D上面的Activity全部出栈,因此,S1中的情况为AD。

singleInstance单实例模式
为加强的singleTask模式,此种模式只能单独的位于一个任务栈中

  • Activity A是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A就在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁。

给Activity指定启动模式

  1. 通过AndroidMenifest设置

    android:launchMode="singleTask"
    
  1. 通过Intent中设置标志位

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    • FLAG_ACTIVITY_NEW_TASK
      为Activity指定“singleTask”启动模式
    • FLAG_ACTIVITY_SINGLE_TOP
      为Activity指定“singleTop”启动模式
    • FLAG_ACTIVITY_CLEAR_TOP
      使用此标记的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。此模式一般和FLAG_ACTIVITY_NEW_TASK 配合使用。
    • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
      使用此标记的Activity不会出现在历史Activity的列表里,相当于
    android:excludeFromRecents="true"
    

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