简介

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》

更多相关文章

  1. android之camera用法实例详解
  2. android动效开篇
  3. Android(安卓)属性动画工作原理
  4. 详解Android中解析XML的方法
  5. Android(安卓)中 Context介绍(sundy深入浅出)之基础概念
  6. android自绘Widget(2D)之修改存在的WIDGET
  7. Android输入框布局如何随键盘变化
  8. Android(安卓)UI设计小知识——渐变色背景的制作
  9. Android(安卓)SurfaceFlinger对VSync信号的处理过程分析

随机推荐

  1. 解决org.apache.http.HttpResponse爆红
  2. 获取系统内存
  3. Android 手机状态
  4. Android 中的 requestWindowFeature
  5. Android HFP Profile 连接过程
  6. android Activity启动初始化与实例化Acti
  7. Android SQLite数据操作 【学习记录】
  8. Using Android Debug Bridge (ADB) via T
  9. android滑动删除的一个开源项目SwipeDelM
  10. Android(安卓)Studio 安装配置详细步骤,以