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详解外加一个重 ...
随机推荐
- MySQL主从复制中断处理一例
收到mysql主从中断报警邮件,马上登上服务器查看,发现是中继日志损坏. Show slave status\G,提示中继日志损坏,按以往的做法,根据提示重新指定合适的日志文件以及pos点. Rel ...
- 关于捕获键盘信息的processDialogkey方法
在一些控件里的keydown方法,没有办法捕获所有的按键消息 比如自己写一个窗体控件库,继承了UserControl 但是没有办法捕获一些键,比如方向键等 所以必须重载 processDialogke ...
- DesignPatterns
1.设计模式,说明工厂模式. 总共23种,分为三大类:创建型,结构型,行为型 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Bui ...
- Memcached‘process_bin_delete’函数安全漏洞
漏洞名称: Memcached‘process_bin_delete’函数安全漏洞 CNNVD编号: CNNVD-201401-174 发布时间: 2014-01-15 更新时间: 2014-01-1 ...
- CSS clip:rect矩形剪裁功能及一些应用介绍
CSS clip:rect矩形剪裁功能及一些应用介绍 by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.co ...
- MySql配置参数很全的Mysql配置参数说明
MySql配置参数 很全的Mysql配置参数说明 1. back_log 指定MySQL可能的连接数量.当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很 ...
- javaweb 之javascript 结合
1.javascript的简介 * 是基于对象和事件驱动的语言,应用与客户端. - 基于对象: ** 提供好了很多对象,可以直接拿过来使用 - 事件驱动: ** html做网站静态效果,javascr ...
- vijosP1049 送给圣诞夜的礼品
vijosP1049 送给圣诞夜的礼品 链接:https://vijos.org/p/1049 [思路] 快速幂+矩阵转换. 将m次矩阵的转换看作是一次快速幂中的乘法操作,这样可以用O(log(k/m ...
- HDOJ-ACM1013(JAVA)
这道题也很简单~主要是将输入转为字符串(存储大数,操作字符数组) 题意: 24 : 2 + 4 = 6 输出6 39 : 3 + 9 = 12 , 1 + 2 = 3 输出3 999: 9 + 9 ...
- [Locked] Unique Word Abbreviation
Unique Word Abbreviation An abbreviation of a word follows the form <first letter><number&g ...