Activity的启动模式

来源:互联网 发布:淘宝店铺扣满48分 编辑:程序博客网 时间:2024/04/30 20:42

Activity的LaunchMode

  • standard:标准模式,也是系统的默认模式。每次启动一个Activity都会重新建一个新的实例,不管这个实例是否已经存在。被创建的实例具有Activity典型的生命周期,在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的任务栈中。注意不能用ApplicationContext启动standard模式Activity,因为ApplicationContext并没有任务栈。
  • singleTop:栈顶复用模式。在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,而且这个Acitivity的onCreate、onStart不会被调用。如果新的Activity不是位于栈顶,那么这个Activity会被重新创建。
  • singleTask:栈内复用模式。这是一种单例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建是实例,同时它的onNewIntent会被回调,而且singleTask默认具有clearTop效果,即如果一个Activity存在任务栈中并且没有位于栈顶,那么当它启动的时候会把它上面的Activity全部出栈,把它切换到栈顶并回调onNewIntent方法。
  • singleInstance:单例模式。这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,它还只能单独位于一个任务栈中。

Activity的Flags

  • FLAG_ACTIVITY_NEW_TASK 这个标记位的作用是为Activity指定“singleTask”启动模式,其效果和在XML中指定该启动模式相同。
  • FLAG_ACTIVITY_SINGLE_TOP这个标记为的作用是为Activity指定‘singleTop’启动模式,其效果和在XML中指定该启动模式相同。
  • FLAG_ACTIVITY_CLEAR_TOP具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。这个标记为一般会和singleTask启动模式一起出现,在这种情况下,被启动Activity的实例如果已经存在,那么系统就会调用他的onNewIntent.如果被启动Activity采用standard模式启动,那么它连同他之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶。
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS具有这个标记位的Activity不会出现在最近任务列表中,它等同于在XML中指定Activity的属性android:excludeFromRecents=“true”。

给Activity指定启动模式

  • 通过AndroidMenifest给Activity指定启动模式
<activity    android:name=".MainActivity"    android:label="@string/app_name"    android:launchMode="singleTask">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>
  • 通过Intent中设置标志位来给Activity指定气筒模式
    Intent intent = new Intent();
    intent.setClass(this,MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

  • 两种方式都可以为Activity指定启动模式,但是二者还是有区别的。首先,优先级上,第二种方式的优先级要高于第一种,其次,两种方式在限定范围也会有所不同,比如第一种方式无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法为Activity指定singleInstance模式。

  • 附上项目地址:https://github.com/boomshakalala/ActivityLaunchModeDemo.git
原创粉丝点击