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详解外加一个重 ...
随机推荐
- [HDU 4549] M斐波那契数列
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- 【转】OS X Mavericks: 防止 Mac 进入睡眠 -- 不错
原文网址:https://support.apple.com/kb/PH13808?locale=zh_CN&viewlocale=zh_CN 某些 Mac 电脑将在不活跃一段时间后自动进入睡 ...
- SharePoint 2010 WSP包部署过程中究竟发生什么?
转:http://www.xue163.com/158/6/1585365.html 在SharePoint 2010中,我们可以使用Visual Studio 2010轻松创建WSP包来安装Web ...
- 1.进入debug模式(基础知识列表)
1.进入debug模式(基础知识列表)1.设置断点 2.启动servers端的debug模式 3.运行程序,在后台遇到断点时,进入debug调试状态 ========================= ...
- c# PrintDocument 设置自定义纸张大小的示例
.Net 提供的打印类PrintDocument 非常简洁易用,不过在实际应用开发中往往需要对纸张进行自定义,尤其是需要进行票据打印时.这个问题也困扰了我许久,经过查阅相关的资料和多次尝试,发现 其实 ...
- MVVM中轻松实现Command绑定(三)任意事件的Command
WPF中不是所有的控件都有Command属性的,如果窗体我需要在ViewModel中处理Loaded事件命令,或者其他事件的命令时,很难都过绑定Command完成,必须要注册依赖属性或事件等,太麻烦了 ...
- POJ 2502 Subway dij
这个题的输入输出注意一下就好 #include<cstdio> #include<cstring> #include<queue> #include<cstd ...
- Java笔记(十九)……多线程
概述 进程: 是一个正在执行中的程序 每一个进程执行都有一个执行顺序,该执行顺序是一个执行路径,或者叫一个控制单元 线程: 就是进程中的一个独立的控制单元,线程在控制着进程的执行 一个进程中至少有一个 ...
- ACM2027
统计元音 Problem Description 统计每个元音字母在字符串中出现的次数. Input 输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串. Ou ...
- HW4.32
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...