Android Activity Launch Mode 启动模式详解

简介

android:launchMode 属性能设置 Activity 对象启动时是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题。
它是 Androidmanifest.xml 中 Activity 的属性,如

<activity  android:name="com.demo.activity.TripRecorderActivity" android:configChanges="keyboardHidden|orientation" android:hardwareAccelerated="false" android:label="@string/app_name" android:launchMode="singleTop" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden|stateAlwaysHidden" >
        </activity>

四种属性值

简单介绍

Activity有四种启动模式,它们是:

  • standard: 标准模式,也是不设置时的默认模式。每次都新建一个实例对象

  • singleTop: 如果在任务栈顶发现了相同的实例则重用,否则新建并压入栈顶

  • singleTask: 如果在任务栈中发现了相同的实例,将其上面的实例对象终止并移除,重用该实例。否则新建实例并入栈

  • singleInstance :允许不同应用,进程线程等共用一个实例,无论从何应用调用该实例都重用


详细介绍

standard

这是launchMode的默认值,Activity不包含android:launchMode或者显示设置为standard的Activity就会使用这种模式。

一旦设置成这个值,每当有一次Intent请求,就会创建一个新的Activity实例。。结果就是这种模式会创建某个Activity的多个实例。

这里写图片描述

singleTop

singleTop其实和standard几乎一样,使用singleTop的Activity也可以创建很多个实例。唯一不同的就是,如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent方法。

使用场景

关于singleTop一个典型的使用场景就是搜索功能。假设有一个搜索框,每次搜索查询都会将我们引导至SearchActivity查看结果,为了更好的交互体验,我们在结果页顶部也放置这样的搜索框。

假设一下,SearchActivity启动模式为standard,那么每一个搜索都会创建一个新的SearchActivity实例,10次查询就是10个Activity。当我们想要退回到非SearchActivity,我们需要按返回键10次,这显然太不合理了。

但是如果我们使用singleTop的话,如果SearchActivity在栈顶,当有了新的查询时,不再重新创建SearchAc实例,而是使用当前的SearchActivity来更新结果。当我们需要返回到非SearchActivity只需要按一次返回键即可。使用了singleTop显然比之前要合理。

singleTask

singleTask这个模式和前面提到的standard和singleTop截然不同。使用singleTask启动模式的Activity在系统中只会存在一个实例。如果这个实例已经存在,intent就会通过onNewIntent传递到这个Activity。否则新的Activity实例被创建。

同一程序内

  • 如果系统中不存在singleTask Activity的实例,那么就需要创建这个Activity的实例,并且将这个实例放入和调用者相同的Task中并位于栈顶。如下图
    这里写图片描述

  • 如果singleTask Activity实例已然存在,那么在Activity回退栈中,所有位于该Activity上面的Activity实例都将被销毁掉(销毁过程会调用Activity生命周期回调),这样使得singleTask Activity实例位于栈顶。与此同时,Intent会通过onNewIntent传递到这个SingleTask Activity实例。如下图
    这里写图片描述

singleInstance

这个模式和singleTask差不多,因为他们在系统中都只有一份实例。唯一不同的就是存放singleInstance Activity实例的Task只能存放一个该模式的Activity实例。如果从singleInstance Activity实例启动另一个Activity,那么这个Activity实例会放入其他的Task中。同理,如果singleInstance Activity被别的Activity启动,它也会放入不同于调用者的Task中。

这里写图片描述

其他

Intent Flags

除了在manifest文件中设置launchMode之外,还可以在Intnet中设置flag达到同样的效果。如下述代码就可以让StandardActivity已singleTop模式启动。

Intent intent = new Intent(StandardActivity.this, StandardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

备注

这四种模式在 Android 5.0 之前及之后、跨程序启动可能略有不同,可自己查找资料或查看下面的原文链接

原文 《Understand Android Activity’s launchMode: standard, singleTop, singleTask and singleInstance》

相关文章
相关标签/搜索