简介

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》

Android Activity Launch Mode 启动模式详解相关推荐

  1. Android系统(187)---最易懂的Activity启动模式详解

    Android基础:最易懂的Activity启动模式详解 前言 Android基础中,Activity的启动模式非常重要 本文将全面介绍 Activity的启动模式 目录 目录 1. 定义 即Acti ...

  2. Activity的启动模式详解

    Activity的启动模式详解 Activity有四种载入模式:standard(默认), singleTop, singleTask和 singleInstance. (1).standard(默认 ...

  3. Android  Doze and App Standby模式详解

    Android  Doze and App Standby模式详解 来源:腾云阁 https://www.qcloud.com/community Optimizing for Doze and Ap ...

  4. Android Activity的4种启动模式详解(示例)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...

  5. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  6. Android启动模式详解

    "在整理完启动模式后,我发现大家对启动模式的理解是有误区的" 引言 再谈启动模式,貌似没啥意思.但是你能正确回答下面的问题吗? 问题1:singleTask启动模式,在启动新的Ac ...

  7. Android中Activity启动模式详解

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

  8. Activity的5种启动模式详解(新增singleInstancePerTask类型)

    前言 看到这个标题的时候,也许你会认为我写错了,Activity不是只有四种启动模式吗?分别为startard,singleTop,singleTask,singleInstance这四种. 一般来说 ...

  9. Activity启动模式详解

    2019独角兽企业重金招聘Python工程师标准>>> Activity有四种加载模式 standard: 标准(默认)模式 当通过这种模式来启动Activity时,总会为目标Act ...

最新文章

  1. 【linux】Valgrind工具集详解(四):抑制错误
  2. Select count(*) 的优化
  3. UNIX环境高级编程第二版_扫描 版笔记
  4. Leaflet中使用NavBar插件实现导航(前进后退)效果
  5. NIPS 2018 论文解读集锦(11月28日更新)
  6. LeetCode872. Leaf-Similar Trees
  7. 数据分析师 vs 算法工程师,Python 出身的程序员如何抉择?
  8. mybatis加载xml配置文件
  9. DVWA全级别通关教程
  10. python分段函数输入x的值求y的值,根据以下分段函数计算y的值,要求x的值由键盘输入,...
  11. 【JAVA程序设计】(C00048)基于springboot酒店宾馆管理系统
  12. 如何禁止某个程序修改计算机,电脑如何禁止某个程序运行?
  13. 直接寻址、间接寻址、立即数寻址、寄存器寻址
  14. Git学习8 Git分支操作
  15. java毕业设计开题报告jsp企业电子投票系统|问卷
  16. 关于时区您了解多少呢?在中国我们使用的是哪个时区?
  17. 《船舶流体力学》知识点总结——1.绪论
  18. matlab计算绝对值的导数,如何用matlab求带绝对值函数的导数? 你值得一看的技巧...
  19. 虚拟机、容器和沙箱是什么关系?
  20. Numpy库 numpy.corrcoef()函数

热门文章

  1. sublime text 食用笔记
  2. 置顶java[常用]-[语法]-[基础操作]
  3. 软件工程——结对编程第一次作业
  4. 高级UI-画笔Paint
  5. *2-3-7-加入field_automation机制
  6. css对齐 挖坑~
  7. AS3工程中的Loading的应用
  8. Python 24天 正则表达式
  9. 数据库备份DBS提供异常任务自助修复
  10. “+=”消除格式的强转问题