launchMode使用详解
launchMode是很基础但是也很容易被忽视的问题,一个高性能的手机App不仅仅是代码完成的非常棒,也包括launchMode的合理使用。一个应用中,到底哪些Activity应该始终保持一个实例,哪些可以多次实例化,哪些要与其他应用共同分享使用,下面我们来慢慢分析。
1.standard
standard是标准启动模式,也是默认启动模式,这种情况下,不管当前Back Stack(回退栈)中有没有要启动的Activity实例,系统 都会将一个新的Activity实例放在栈顶。假设我们现在有两个Activity,一个是MainActivity,另外一个是MainActivity2,我们先从MainActivity中启动MainActivity2,然后在MainActivity2中不断启动MainActivity2,看看效果:
因为启动模式是standard,所以每当我们打开一个Activity,就会有一个Activity放在Back Stack栈顶,因此,当我们多次打开MainActivity2之后,我们需要点击6次回退按钮才能回到主界面,虽然整个应用只有两个Activity,但是MainActivity2却在栈中保存了多份实例。
2.singleTop
singleTop就比较有意思了,当一个Activity的启动模式是singleTop时,如果当前Back Stack栈顶是要启动的Activity,那么就不会再创建一个Activity实例,而是直接显示当前栈顶的Activity,同时调用该Activity的onNewIntent()方法;否则就会创建一个新的Activity实例放在栈顶。还是上面那个栗子,改变Activity启动模式后我们看看有什么不同:
这下不管我们启动MainActivity2多少次,最终都只需点击两次后退按钮就能回到主界面,因为当MainActivity2处于栈顶的时候系统不会再创建新的MainActivity2实例,只是会调用当前实例的onNewIntent方法。
2.1应用场景
singleTop的使用场景还是比较多的,比如说我们目前正处在ActivityA上,这时系统忽然接收到一条广播,这条广播要求打开ActivityA,那么这个时候就没有必要再创建一次ActivityA放在栈顶,否则当你退出ActivityA的时候就会发现要连续点击两次才能退出ActivityA。还有就是微信的搜索功能,当我们点击搜索按钮之后,微信会跳转到查询结果页面,但是在查询结果页面,为了我们能够接着搜索,该页面上方还有搜索框,如此一来,如果不使用singleTop启动模式,那么当我们搜索十次之后岂不是要按十次返回键才能回到主页面?实际上肯定不是这样的,这里就是singleTop使用的最好例子之一。
3.singleTask
当一个Activity启动模式设置为singleTask时,如果要启动ActivityA,但是当前Back Stack中已经存在ActivityA只是不在栈顶,这个时候会将ActivityA上面的Activity全部移除,使得ActivityA处于栈顶,同时也会调用ActivityA的onNewIntent方法。换句话说,对于一个Activity而言,整个Back Stack中最多只存在它的一个实例。假如我们有两个Activity,这两个Activity的启动模式都是singleTask,在MainActivity中启动MainActivity2,在MainActivity2中启动MainActivity,然后点击回退按钮,会出现什么情况?看下图:
我们来简单分析一下,应用启动之后,Back Stack中只有一个MainActivity,当MainActivity启动MainActivity2的时候,这个时候栈中并没有MainActivity2,所以会创建一个MainActivity2的实例放在栈顶,当MainActivity2启动MainActivity时候,由于栈中已经有了MainActivity,只是不在栈顶,这个时候系统会将栈顶了MainActivity2移除(调用MainActivity2的生命周期方法),然后MainActivity就会处于栈顶,这个时候栈中只有一个Activity,所以点击一次回退按钮就能回到手机主界面。
3.1应用场景
singleTask一般用在应用程序的主界面,对于大部分应用,当我们在主界面点击回退按钮的时候都是退出应用,那么那么当我们第一次进入主界面之后,主界面位于栈底,以后不管我们打开了多少个Activity,只要我们再次回到主界面,都应该使用将主界面Activity上所有的Activity移除的方式来让主界面Activity处于栈顶,而不是往栈顶新加一个主界面Activity的实例(说到这里小伙伴们应该知道怎么样退出一个App了吧)。
4.singleInstance
singleInstance总的来说用的还是比较少见,singleInstance和singleTask比较像,不同的是当我们将一个Activity启动模式设置为singleInstance时,当启动这个Activity时,系统会把这个Activity放在一个新的Task中,然后如果有其他应用要使用也从这个新的Task中调用该Activity。注意这里有了一个很大的不同就是系统中有了两个Task,假如我们有两个Activity,MainActivity和MainActivity2,MainActivity的启动模式为默认模式,MainActivity2的启动模式为singleInstance,当我们从MainActivity启动MainActivity2之后,然后点击home键,再从任务管理器回到MainActivity2,然后点击回退按钮,看看会出现什么情况:
当我们通过任务管理器回到MainActivity2的时候,点击一下回退按钮竟然没有回到MainActivity,而是直接退出应用,这是因为MainActivity2所在的栈中就它一个Activity,那么点击回退按钮当然会退出当前应用。
好了,关于Activity启动模式的就说这些,合理使用Activity启动模式,可以在很大程度上提高应用性能。
版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。
launchMode使用详解的更多相关文章
- Xamarin android 之Activity详解
序言: 上篇大概的讲解了新建一个android的流程.今天为大家带来的是Activity详解,因为自己在开发过程中就遇到 好几次坑,尴尬. 生命周期 和Java里头一样一样的,如图 图片来源于网上哈, ...
- [转]AndroidManifest.xml文件详解
转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...
- 详解Android Activity---启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
- AndroidManifest.xml 最全详解
AndroidManifest.xml 是每个android程序中必须的文件,它位于整个项目的根目录.我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息.但是对于这个文件 ...
- Android application 和 activity 标签详解
extends:http://blog.csdn.net/self_study/article/details/54020909 Application 标签 android:allowTaskRep ...
- 详解Android中的四大组件之一:Activity详解
activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...
- Android组件系列----Activity组件详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- AndroidManifest.xml配置文件详解(转载)
AndroidManifest.xml配置文件详解 2013-01-05 10:25:23 分类: Android平台 AndroidManifest.xml配置文件对于Android应用开发来说是 ...
- android 四大组件详解
这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...
随机推荐
- perl + 匹配前导模式一次或者多次
Vsftp:/data01/mysqllog/binlog# cat a2.pl $_="aaaa@[2]sasas"; if ($_ =~/.*?(\@\[[0-9]+\]).* ...
- 【HDOJ】4400 Mines
(1) KD树,但实际没有STL快,3000+ /* 4400 */ #include <iostream> #include <string> #include <ma ...
- poj2229Sumsets
http://poj.org/problem?id=2229 挺好的一公式.. #include <iostream> #include<cstdio> #include< ...
- Hadoop源代码分析【IO专题】
由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化.Hadoop并没有采用Java的序列化(因为Java序列化比较复杂,且不能深度控制),而是引入了它自己的系统. ...
- jQuery on()方法绑定动态元素的点击事件
之前就一直受这个问题的困扰,在jQuery1.7版本之后添加了on方法,之前就了解过,其优越性高于live(),bind(),delegate()等方法,在此之前项目中想用这个来测试结果发现,居然动态 ...
- Read ListViewItem content from another process z
Normal Windows GUI applications work with messages that are sent to a window or control and the cont ...
- 【原】1.1RDD源码解读(二)
(6)transformation 操作,通过外在的不同RDD表现形式来达到内部数据的处理过程.这类操作并不会触发作业的执行,也常被称为lazy操作. 大部分操作会生成并返回一个新的RDD,例sort ...
- [九度OJ]1008.最短路径问题
原题链接:http://ac.jobdu.com/problem.php?pid=1008 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离 ...
- 在Eclipse中使用Maven插件 博客分类: Java相关技术
简介 本文介绍如何在Eclipse中通过maven插件编写java项目和web项目. 安装Maven 下载Maven最新版本,见:maven.apache.org/download.html 当前版本 ...
- C#调用VC dll输出参数
最近做项目需要把以前Vc写的程序整合到VS2005来,用c#写的,以前VC的动态连接库写好了,重写比较麻烦,让C#调用VC dll就好了.但碰到了一个问题:VC中作为输出参数的char*类型的变量应该 ...