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详解外加一个重 ...
随机推荐
- Eclipse设置、问题解决方案
Eclipse设置: 1.如何把eclipse关闭提示调出来? 可以这样打开这个提示:选择 Windows --Preferences,在左边树上选择“General” --“Startup and ...
- trash目录: ~/.local/share/Trash
trash目录:~/.local/share/Trash
- LFS 中文版手册发布:如何打造自己的 Linux 发行版
您是否想过打造您自己的 Linux 发行版?每个 Linux 用户在他们使用 Linux 的过程中都想过做一个他们自己的发行版,至少一次.我也不例外,作为一个 Linux 菜鸟,我也考虑过开发一个自己 ...
- FlowLayoutPanel autowrapping doesn't work with autosize
There is no such thing like impossible in software development. Impossible just takes longer. I've i ...
- FZU2235 国王的出游 水题
因为只有1e5个点,所以直接离散化bfs就好 #include <cstdio> #include <cstring> #include <queue> #incl ...
- Oracle 12c创建用户时出现“ORA-65096: invalid common user or role name”的错误
这篇文章主要介绍CDB和PDB的基本管理,资料来源oracle官方. 基本概念: Multitenant Environment:多租户环境 CDB(Container Database):数据库容器 ...
- JZ2440开发笔记(2)——minicom的安装和配置使用【转】
一.安装配置minicom 1.安装minicom lingd@ubuntu:~$ sudo apt-get install minicom 2.配置minicom lingd@ubuntu:~$ s ...
- 最近用unity5弄的一些渲染
unity5 人皮渲染 Skin Shading 换了一种方法,优化了一下代码,unity5效果很好,消耗不大 点开可查看大图 加入了次表面散射的阴影与自阴影 unity5 ocean real- ...
- mac os 常用终端软件工具
1. homebrew 安装 网上很多版本返回400错误,以下为最新版本地址(2015/02/09) ruby -e "$(curl -fsSL https://raw.githubuser ...
- Unity光照图UV显示
美术的同学觉得 Unity 光照图烘焙的不够美丽,需要在 ps 里修一修,但是不知道每个物体对应的光照图在哪个区域,UV 是如何分布的,于是要求写一个工具显示,于是有了下面这个: 打开场景自动读取当前 ...