Activity LauchMode启动模式(转载)
转载于:http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html
在一个Android应用中,不可避免的会包含多个Activity,当开启多个Activity之后,当按后退键时,一般会回退到上一个 Activity,这一点和浏览器有点类似,但是需要注意的是Android系统只能回退到上一个Activity,没办法前进到下一个 Activity,维护这个功能就需要了解到一个回退栈(Back Stack)的概念。
这篇博客就着重讲
什么是回退栈?
首先先来了解一下应用程序与进程的关系,众所周知,Android下有四大组件:Activity、Service、Receiver、 ContentProvider。一般开发一个应用程序,会包含多个Android组件,所以应用程序是一组组件的集合,而进程则是运行这些组件的载体。
而回退栈(Back Stack)只是针对Activity而言的,它是用来维护用的界面体验的,使一个Task让用户感觉就是一个应用,而无论其中的Activity是否来 自同一个应用程序,所以不要把回退栈和进程弄混了。设备的Home页面是大多数Task的起始位置,当用户点击一个应用程序图标的时候,应用的Task就 会来到前台,并把应用的主Activity压入BackStack的栈顶,并获得焦点,这个Activity称为根Activity,而在 BackStack中的Activity可以通过点击回退键弹出栈并销毁,这时就会使上一个Activity获得焦点,直到用户返回到Home页,而当 BackStack中的Activity都被弹出销毁之后,这个Task就不复存在了,但是这个程序的进程还存在(不在此时销毁)。
Task的状态
就像上面介绍的,每个Task都存在一个BackStack,而系统中可以存在多个Task,但是每次只有一个Task获得前台焦点,一般而 言,系统允许用户在多个Task中切换,而被至于后台的Task中的Activity,将被置于Stopped状态。实际上,同一个Task中的 Activity,只要不存在于栈顶并且获得前台焦点的Activity,那么它就是一个Stopped的状态。下图为官方文档中关于Task前后台的示 例图:
Activity的启动模式
根据Activity的不同的启动模式,它在BackStack中的状态是不一样的。Activity可以通过 AndroidManifest.xml清单文件配置,在<Activity />节点中的android:launchMode属性设置。它有四个选项:
standard
标准启动模式,也是默认启动模式,如果不设置android:launchMode属性的话。standard模式下的Activity会依照启动的顺序压入BackStack中。
下图是standard模式下,Activity的压栈和回退操作示意图:
singleTop
单顶模式,这种Activity启动模式,启动一个Activity的时候如果发现BackStack的栈顶已经存在这个Activity 了,就不会去重新创建新的Activity,而是复用这个栈顶已经存在的Activity,避免同一个Activity被重复开启。
下图是singleTop模式下,Activity的压栈和回退操作示意图:
singleTop的应用场景很多,一般适用于可以复用而又有多个开启渠道的Activity,避免当一个Activity已经开启并获得焦点 后,再次重复开启。比如说Android系统浏览器的书签页面,就是一个singleTop模式的Activity。Android的浏览器是基于 WebKit内核编写的,它是支持JavaScript脚本语言的,可以通过JavaScript脚本设置浏览器书签,这样如果存在多个页面存在保存书签 的JavaScript脚本,就会导致书签页面被多次开启,所以书签页面被设置为singleTop模式,这样可以避免在保存多个书签的时候重复开启书签 页面。
singleTask
开启一个Activity的时候,检查BackStack里面是否有这个Activity的实例存在,如果存在的话,情况BackStack里这个Activity上所有的其他Activity。
下图是singleTask模式下,Activity的压栈和回退操作示意图:
singleTask的的适用场景为一般程序的主页面,当回退到主页面的时候,清除BackStack中,它之上的所有Activity,这样 避免程序导航逻辑的混乱。比如Android系统的浏览器的主页面,就是singleTask模式的,上面提到,android下浏览器是Webkit内 核的,它是由C语言编写的,而每次打开新的网页如果重新开启一个Activity,是非常耗费系统资源的(需要解析HTML、Script脚本),所以被 设置为singleTask模式,这样在浏览器应用里,无论打开多少个页面,使用的都是同一个Activity。所以以后如果存在很耗费系统资源的 Activity,可以考虑使用singleTask开启模式。
singleInstance
被标记为singleInstance启动模式的Activity,在启动的时候,会开启一个新的BackStack,这个BackStack 里只有一个Activity的实例存在,并且把这个BackStack获得焦点。这是一种很极端的模式,它会导致整个设备的操作系统里,只会存在一个这个 Activity示例,无论是从何处被启动的。
下图是singleInstance模式下,Activity的压栈和回退操作示意图:
singleInstance一般适用于需要在系统中只存在一个实例的场景,比如Android系统的来电页面,多次来电均使用的是一个Activity。
当然,在Android中,除了在AndroidManifest.xml清单文件中配置LauncherMode属性外,还可以在代码中设置 启动模式。在组件中,启动一个Activity,需要用到startActivity()方法,其中传递一个Intent,可以使用 Intent.setFlags(int flags)来设置新启动的Activity的启动模式,而通过代码设置Activity的启动模式的方式,优先级要高于在 AndroidManifest.xml清单文件中的配置。
Intent.setFlag(int flags)方法传递的一个整形的数据,被Android系统设置为了常量:
- FLAG_ACTIVITY_NEW_TASK:这个标识会使新启动的Activity独立创建一个Task。
- FLAG_ACTIVITY_CLEAR_TOP:这个标识会使新启动的Activity检查是否存在于Task中,如果存在则清除其之上的 Activity,使它获得焦点,并不重新实例化一个Activity,一般结合FLAG_ACTIVITY_NEW_TASK一起使用。
- FLAG_ACTIVITY_SINGLE_TOP:等同于在LauncherMode属性设置为singleTop。
Activity LauchMode启动模式(转载)的更多相关文章
- Activity学习(二):Activity的启动模式(转载)
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- Activity的启动模式--总结
3. Activity的任务栈Task以及启动模式与Intent的Flag详解? 2,Activity次级页面和主页间来回跳转,防止重复创建Activity实例 1, activity的启动模式: / ...
- Android中Activity的启动模式和使用场景
一.为什么需要启动模式 在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些A ...
- 转 Android中Activity的启动模式(LaunchMode)和使用场景
转载请注明出处:http://blog.csdn.net/sinat_14849739/article/details/78072401本文出自Shawpoo的专栏我的简书:简书 一.为什么需要启动模 ...
- 关于activity的启动模式
在Android中每个界面都是一个Activity ,界面的切换实际上是对不同Activity实例化的过程.而启动模式就决定Activity启动运行方式. 1.设置方式它是在主配置文件中,Activi ...
- 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)
1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...
- android Activity的启动模式与flag的见解
最近做一个安卓项目,想要实现的效果就是:当打开一个按钮的时候,启动了一个A功能,当用户返回到桌面再继续进去的时候,不过之前在哪个Activity,都会先跳转到A功能的那个界面,当用户点击返回的时候,再 ...
- android Activity的启动模式
Android中Activity启动模式详解 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启 ...
- Activity的启动模式(android:launchMode)
在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...
随机推荐
- 阿里云-对象储存OSS
最近 需要搞一个阿里云的文件上传 手机端主要做了图片上传 pod安装:pod 'AliyunOSSiOS', '~> 2.5.2' 主要就是需要四个参数:accessKey secretKey ...
- 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解
最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...
- JPA 系列教程 异常 集锦
异常1.hibernate升级到3.5版本 异常信息摘要: Associations marked as mappedBy must not define database mappings like ...
- 打印机服务器搭建 -cups
系统:ubuntu 14.04 http://foo2zjs.rkkda.com/INSTALL 安装cups sudo apt-get install cups 安装完成后,把打印机的数据线与服 ...
- php app版本升级的思路
用户端传递当前app的版本号,再根据机型和app_type ,查找数据库里的版本号 ,去比较 ... CREATE TABLE `common_versioninfo` ( `id` int(11) ...
- android 调用.NET WebServices
下载Ksoap2.jar, import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.*;import org.ksoap2.tra ...
- 第三章 Netty入门应用
3.1 Netty开发环境的搭建 3.1.1 下载Netty的软件包 3.1.2 搭建Netty应用工程 3.2 Netty服务端开发 3.3 Netty客户端开发 3.4 运行和调试 3.4.1 服 ...
- hancher57公众号突破3000人
- 部署WEB应用的三种方式[转]
一.基本部署 Tomcat安装目录下有一个webapps目录,该目录存放所有的WEB应用程序,Tomcat会自动管理该目录下的所有WEB应用.因此,最简单的部署方式就是将要部署的WEB应用直接拷贝到T ...
- 读书笔记之C# delegate
c#代理的使用主要在:需要将一个方法当做参数传递到另一个方法时. 比如启动一个线程执行任务,而这个线程要执行的方法可以通过代理传递过来. 代理包括一个方法或者多个方法的地址和C++的函数指针很相似,但 ...