


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、全面解析Activity 的4种启动模式说到An droid的启动模式,首先来看一个实际的业务场景。我之前在公司实习的时候, 我所在的部门只负责一个品类国际机票,那用户从机票首页开始搜索机票到最终完成订单并支付大致分为以下几个流程实际流程因为考虑的问题比较多,所以要比这稍微复杂 些:1. 用户在机票首页确认好出发、到达目的地、日期与人数后,就可以点击“搜索'进 入到搜索结果页2. 用户根据意愿选择相应航班并点击进入确认订单页3. 用户确认好订单容点击下单,开始支付,支付完成跳支付完成页4. 用户可以选择回到首页,或者去公共订单系统查看订单详情这属于公共局部,不 在我们讨论的围了经过上面
2、4个步骤整个购票流程就算完毕了。但是,这里有个问题,就是用户从首页到最后的支付完成页之间经历了这么多的Activity ,那用户完成了支付后想回到首页是不是要一层一层的往回退才行?如果是这样的话,那就太不人性化了,那怎样才能在完成支付后一键回到首页呢?有人可能会说,那就直接从支付完成页跳转到首页不就可以了吗?这样当然是可以的,但是这样做那之前翻开的那么多Activity 怎么办呢?难道就让它们待在Activity 任务栈中吗?这样岂不是太浪费存了!请看我画的示意图:L首页2-搜索结果虫孔确认订单贡4支付完成页2. 搜黨结果眞'M嗚认订单页4*支付完成頁Task HlTask #1如上图
3、所示,如果我们在支付完成之后启动首页Activity 那页面1-页面5之间的所有Activity 对用户来说都是无用的,并且占用的存,极浪费这本来可能就很紧的An droid存资源。那有没有一些优雅的方式来解决这个问题呢?我们可以想象一下,有没有可能在从页面4跳转首页的时候把原来处于首页之上的所有Activity全部干掉呢?这样不就刚好解决了我们刚刚所说浪费资源的问题了吗?就像以下图一样:1.首页I窕首页乙搜素结果訂I;*,!*3. 确认订单页4支付芫成页Tasl #1Tft5k#l很显然,无论从用户体验的角度还是从存优化的角度来看第二种方式都是最为优雅的。那怎么实现这种需求呢?有人可能会说,
4、可以将任务栈中页面1之上的所有Activity一层一层地执行finish()方法销毁掉,这样就可以回退到页面1。这样确实是可行的,但是有个问题:如果希望从页面4跳转到页面1时传递一些数据回去,比方说订单号、支付完成 等信息,还需要在 finish()执行前执行 setResult(int resultCode, Intent intent)将要往回传递的数据放在In te nt里面。这样做其实是有风险的,因为An droid系统并不保证Activity任务栈中那些不可见的Activity的状态是一直被保存着的,如果出现系统存缺乏的情况,An droid系统是可以回收那些处于不可见状态的Acti
5、vity 的。也就是说,一旦中间有一 Activity被销毁了,那这个传递链就失去成效了。那应该怎么办呢?别着急,Google的An droid工程师早就已经为我们想到这种需求了。那应该怎么做呢?其实就是通过设置Activity的启动模式来实现。好,问题抛出了,下面让我们一步一步来看。Activity有哪几种启动模式?Activity一共有4种启动模式,分别是I .standard n . singleTop 川.singleTaskIV .sin gle In sta neeF面我来分别做介绍。、 standard顾名思义, standard 英文意思就是“标准的。也就是说这种启动模式是默认
6、的, 我们平时在开发中使用最多的就是 Standard 模式的。如果一个 Activity 的启动模式被设置成 standard ,那么它可以无限制的创立。你每一 次通过 Intent 去启动这种模式的 Activity 都会重新创立一个。大家可以想象一下里的收件箱假设我们将翻开的 Activity 的启动模式设置为 Standard ,当然这也是默认的模式里有 10 封。我们给查看的 Activity 起名为 CheckEmailActivity, 我点击第一封将会翻开一个 CheckEmailActivity ,当我看完之后点击 下一封,另一个 CheckEmailActivity 又会被
7、创立,这样如果我们将 10 封全部看完,那在 Activity 任务栈中将会有 10 个 CheckEmailActivity ,而且如果我想回到收件箱页面还必须 点 10 次返回键!想想是不是很可怕?所以说 standard 模式虽然很常用,但也不是适用于任何场合。另外说一点, standard 模式在 Android 5.0 Lollipop 之前和之后是有区别的。Android Lollipop 之前standard 模式的 Activity 总是会被创立在启动它的 Activity 同一个任务栈中顶端 任 务栈是一个栈结构,先进后出 First In Last Out ,就算他们来自不
8、同的应用。想象一个场景, 如果你在 A 应用中要分享一个本地图片, 这样会翻开系统的图片查看应 用中的图片选择器 Activity ,虽然这两个 Activity 来自不同的应用,但 Android 系统仍将 会把他们放在同一个任务栈中,即A 应用的任务栈中。Activity 1Activity 1Activity 2Task #1Fask#lAn droid Lollipop之后如果将要启动的 Activity 和启动它的Activity来自同一个应用,那没话说,和Lollipop之前一样,新的Activity会被创立在当前任务栈中的顶端。但是如果它们来自不同的应用,那就会创立一个新的任务栈
9、,再把要启动的Activity放在新的任务栈中,这时这个新启动的 Activity就是新创立的任务站点的根Activity 。如以下图所示:Activity 1分享图片Activity 2Task #1、singleTop顾名思义,sin gleTop的意思就是"在顶部只能有一个这种启动模式非常类似于standard,但是也有一些区别:如果在启动这种模式的Activity的时候,当前任务栈的顶端已经存在了一样的Activity,那系统就不会再创立新的,而是回调任务栈中已经存在的该Activity 的onN ewI nte nt() 方法。请看下面的示意图:DemoActivitytJ
10、Lc.| IIIIT餐t 料Tastffl也正因为SingleTop启动模式的特殊性,所以在开发时,如果指定了一个Activity的启动模式是sin gleTop的那就应该既要重写 on Created。方法用于应对第一次创立的情 况,也要重写onNewIn te nt() 方法来应对重复创立的情况。其实大家可以想象一下,这种启动模式的应用场景。An droid既然提供了这种启动模式,说明肯定有应有场景需要这样的方式。其实最常用的场景就是搜索,比方说我们在搜索框中输入想要搜索的容点击搜索进入SearchResultActivty( 搜索结果页)查看搜索的结果一般我们也会在搜索结果页提供搜索框,
11、这样用户无需点击返回键回到上一个页面再在搜索框中输入搜索容点击搜索,如果此时用户还想搜点别的东西,就可以直接在当前的搜索结果页 SearchResultActivty中的搜索框输入搜索容继续搜索。大家想象一下,如果我们把SearchResultActivty的启动模式设置为 Standard的话会是什么样的景象。比方我们连着搜了10个容,那就会启动10个不同的SearchResultActivty,然而这些 SearchResultActivty功能完全一样,完全没有必要创立这么多,而且还有一个和上一节中的一样的问题,就是用户搜索完毕想回到首页,那就还得按10次返回键才能回到首页,-!这时,s
12、ingleTop启动模式就派上用场了,我们首先把SearchResultActivty 的启动模式设置为singleTop,这样用户在SearchResultActivty页面中继续搜索的时候,我们只需 把用户要搜索的容放在 Intent 里面然后启动 SearchResultActivty ,这时系统并不会重新 创立新的 SearchResultActivty ,而是回调当前任务栈栈顶的 SearchResultActivty 的 onNewIntent() 方法来接收带有用户搜索容信息的 Intent ,然后我们拿到用户搜索容后调搜 索接口, 并根据接口返回容重新刷新布局即可, 似不似很神
13、奇?其实我们在上一节提到的的 问题,也是用这种方式来解决的,原理和搜索一样的。三、 singleTask这种启动模式的 Activity 在 Android 系统中只允许存在一个实例。如果系统中已经存在了该种启动模式的目标 Activity ,那么系统并不会重新创立一个 目标 Activity ,而是首先将持有目标 Activity 的整个任务栈都会被置于前台 用户可见 , 并且通过 onNewIntent( ) 方法将启动目标 Activity 的 Intent 传递给目标 Activity ,置于 目标 Activity 拿到这个 Intent 之后要做什么操作, 系统就不管了, 随便你拿
14、来干什么, 哼 。但是这里有个问题,就是目标 Activity 和源 Activity 是不是来自同一应用。源 Activity 和目标 Activity 来自同一个应用这种情况还要分两种情况说:当前系统中还没有目标 Activity 的实例这种情况最简单, 直接在当前的任务栈中创立 SingleTask 模式的 Activity 并置于栈顶即可。当前系统中已经存在目标 Activity 的实例 这种情况比较特殊, 因为系统会把任务栈中目标 Activity 之上的所有 Activity 销毁, 以让 目标 Activity 处在栈顶的位置。这里还要还要再提醒大家的是,因为目标 Activit
15、y 已经存在,系统不会重新创立,而 是通过 onNewIntent() 的方式把 Intent 传递过来,这点和 singleTop 模式有些类似。注意 了,这里让我们回想一下文章开头的我所说的场景, 如何让用户在支付完成页直接跳转到首 页,并把不需要的 Activity 销毁? SingleTask 启动模式是不是刚好和我们的需求一致?请 看下面的示意图:Ta-kfflTask #11.首页2搜當结果页 J 川“F凯11 !( f *>13,确彳门丁单庫«刚1i.I1'Bii 1 !: :!ii-iii! _ T u Npwintpntf )j: i-I«
16、i1 i*V1*13iIiip*V源Activity 和目标Activity 来自不同应用,这种情况也要分两种情况说:当前系统中还没有目标Activity 的实例这时系统首先会看任务管理器中是否有目标Actvity 所在应用的任务栈?如果有的话, 那就直接在目标Activity所在应用的任务栈的栈顶创立即可。如果任务管理器中没有目标Activity所在应用的任务栈,系统就会创立其所在应用的任务栈和目标 Activity ,并且把目标 Activity作为新建任务栈的根Activity 。如以下图所示:当前系统中已经存在目标Activity 的实例目标Activity所在任务栈会被置于前台即用户
17、可见,而且也会把目标Activity之上的所有Actvity全部销毁。So u rccrAct I viCvSdurcie-ActivltvTaskTask 科 1四、singlelnstanee这种启动模式和sin gleTask几乎一样,它也只允许系统中存在一个目标Activity ,包 括上面我们所说的 SingleTask的一些特性singlelnstanee 都有。唯一不同的是,持有目标 Activity 的任务栈中只能有目标 Activity 一个Aetvitiy ,不能再有别的Activity ,对!就 是承包了这个任务栈!哈哈 。其实从这种启动模式的名字也可以看出来它表示的意思
18、,sin gle In sta nee直译过来就是“单一实例,什么意思呢?这话啊有两层意思,我来给你分析分析:1跟系统说,“我是独一无二的,不许和我一样的人存在!",这就是说系统中存在一个目标Activity 。;2.跟任务栈说,“我是独一无二的,不许你心里再装别的人!",这就是说持有目标 Activity 的任务栈中只能有目标Activity 一个Activity。这样说是不是好理解一些,哈哈所以,如果要启动 singlelnstanee模式的Activity,那只能新创立一个任务栈用来放它,因为人家说了,“我是独一无二的!"。同样的,如果从这种启动模式的Act
19、ivity 中启动别的Activity,那不好意思,我不管你是不是和我处在同一个应用,我所在的任务栈只能拥有我一个人,您呐,另外让系统给你创立一个任务栈待着去吧。好了,至此我们介绍了Activity 的4种启动模式了,也大致了解了每种启动模式的特点了,那接下里的问题就是怎么使用呢?问题又抛出来了,好,让我们接着往下看。怎么使用启动模式?有两种方式来使用或者说设置Activity 的启动模式:方式1:在AndroidMenifest.xml文件中设置:activity android name ,app.DemoActivity"android:label="string/D
20、enoM android theme "iSstvle/Theme.Dialog" :android launchMode "singleTask", ;activity看到没有,在标签中设置 android:launchMode= " * “属性即可,*即我们上面所说的 四种启动模式。方式2:通过为Intent添加标识来设置rntrnt intent, _) 加疋如 现珂class)5 intent addFlags(Intent FLAG ACTIVITY SINGLE TASK);-startActivrty(intent);看到没有,这里使用Intent的addFlags()方法来添加一些标志,其实这个addFlags()不光可以用来设置 Activity 附加属性。具体的可以参见的启动模式,还能做很多事情,匕的作用是给Intent添
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消费者对口腔清洁包装满意度分析报告
- 集装箱租赁价格波动分析报告
- 2025年尾矿处理技术突破与生态环境修复模式研究报告
- 2025年个人养老金制度对智能家居产业投资市场的机遇与挑战研究报告
- 中医经典选读试题及答案
- 房产赠与合同协议
- 2025年文化创意产业园区品牌塑造策略与产业集聚的文化创意产业报告
- 中医临床类考试题及答案
- 中医面瘫考试题及答案
- 主题公园沉浸式体验设计在2025年的情感化设计理念与项目开发报告
- 《河道疏浚砂石综合利用方案编制导则》
- 【浅谈中式面点的造型与制作规范4500字(论文)】
- 汽车技师3000论文范文(篇一)
- 外科主治医师考试-外科学基础知识讲义03外科休克
- ISO9001、ISO14001及ISO45001质量环境及职业健康安全三体系内审及管审资料
- 土壤学-土壤矿物质
- DL-T-5161.17-2018电气装置安装工程质量检验及评定规程第17部分:电气照明装置施工质量检验
- 进出口企业进出口业务内部审计制度(AEO认证文件)
- 玉溪实验中学初一招生考试数学试卷答案
- (正式版)HGT 22820-2024 化工安全仪表系统工程设计规范
- 先学后教当堂训练课堂教学模式培训
评论
0/150
提交评论