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》
Android Activity Launch Mode 启动模式详解相关推荐
- Android系统(187)---最易懂的Activity启动模式详解
Android基础:最易懂的Activity启动模式详解 前言 Android基础中,Activity的启动模式非常重要 本文将全面介绍 Activity的启动模式 目录 目录 1. 定义 即Acti ...
- Activity的启动模式详解
Activity的启动模式详解 Activity有四种载入模式:standard(默认), singleTop, singleTask和 singleInstance. (1).standard(默认 ...
- Android Doze and App Standby模式详解
Android Doze and App Standby模式详解 来源:腾云阁 https://www.qcloud.com/community Optimizing for Doze and Ap ...
- Android Activity的4种启动模式详解(示例)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...
- Android Activity 启动模式详解
最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...
- Android启动模式详解
"在整理完启动模式后,我发现大家对启动模式的理解是有误区的" 引言 再谈启动模式,貌似没啥意思.但是你能正确回答下面的问题吗? 问题1:singleTask启动模式,在启动新的Ac ...
- Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- Activity的5种启动模式详解(新增singleInstancePerTask类型)
前言 看到这个标题的时候,也许你会认为我写错了,Activity不是只有四种启动模式吗?分别为startard,singleTop,singleTask,singleInstance这四种. 一般来说 ...
- Activity启动模式详解
2019独角兽企业重金招聘Python工程师标准>>> Activity有四种加载模式 standard: 标准(默认)模式 当通过这种模式来启动Activity时,总会为目标Act ...
最新文章
- 【linux】Valgrind工具集详解(四):抑制错误
- Select count(*) 的优化
- UNIX环境高级编程第二版_扫描 版笔记
- Leaflet中使用NavBar插件实现导航(前进后退)效果
- NIPS 2018 论文解读集锦(11月28日更新)
- LeetCode872. Leaf-Similar Trees
- 数据分析师 vs 算法工程师,Python 出身的程序员如何抉择?
- mybatis加载xml配置文件
- DVWA全级别通关教程
- python分段函数输入x的值求y的值,根据以下分段函数计算y的值,要求x的值由键盘输入,...
- 【JAVA程序设计】(C00048)基于springboot酒店宾馆管理系统
- 如何禁止某个程序修改计算机,电脑如何禁止某个程序运行?
- 直接寻址、间接寻址、立即数寻址、寄存器寻址
- Git学习8 Git分支操作
- java毕业设计开题报告jsp企业电子投票系统|问卷
- 关于时区您了解多少呢?在中国我们使用的是哪个时区?
- 《船舶流体力学》知识点总结——1.绪论
- matlab计算绝对值的导数,如何用matlab求带绝对值函数的导数? 你值得一看的技巧...
- 虚拟机、容器和沙箱是什么关系?
- Numpy库 numpy.corrcoef()函数