Android组件体系之Activity启动模式解析
本文主要分析Activity的启动模式及使用场景。
一、Activity启动模式浅析
1、standard
标准模式,系统默认的启动模式。在启动Activity时,系统总是创建一个新的Activity实例。其缺点是:复用性差、占用内存,当Activity已经在栈顶时,还是会创建实例。
2、singleTop
这种模式可以实现栈顶复用的效果。
如果目标Activity已经存在于栈顶,则调用实例的 onNewIntent,否则创建一个新的实例,可以用于通知启动的内容显示,例如新闻客户端的内容页面。信息类应用的列表Activity往往也会使用这种启动模式,例如,收到新短信时,如果信息列表Activity已经在栈顶了,则直接调用其onNewIntent,而不需要创建新的Activity。
该模式下,当Activity不在栈顶时,还是会创建新的实例。例如A、B、C三个Activity处于一个任务栈中,且C在栈顶,如果C启动A,则会创建一个新的实例并置于栈顶,使得当前任务栈有两个A实例。
3、singleTask
该模式实现栈内复用的效果。如果栈内已经有目标Activity实例,则清除目标Activity上面的所有Activity、使得目标Activity直接放到栈顶,并调用目标Activity的onNewIntent方法;否则创建一个新的Activity实例。
补充,该模式Activity会在跟它有相同taskAffinity的任务中启动,并且位于这个任务的堆栈顶端,这样如果我们没有设置taskAffinity,从本应用启动的Activity就会复用当前Task,也就不会创建一个新的Task。
该启动模式,适合作为程序入口点,例如原生Launcher以及相机应用中的CameraActivity,就是使用了这种启动模式。
4、singleInstance
系统级的复用。启动Activity时,如果系统中不存在该Activity实例,则创建一个新的ActivityTask,并且独占这个Task,否则显示已有的Activity实例。通常用于系统级的应用,在整个系统中只有一个实例,例如来电提醒、闹钟提醒。
这四种启动模式创建一个新Activity实例的几率,是依次降低的。实际在使用时,往往会用到动态设置启动模式,给Intent设置特定的Flag,例如FLAG_ACTIVITY_SINGLE_TOP(对应singleTop)、FLAG_ACTIVITY_NEW_TASK(对应singleTask)。
二、使用中的注意事项
首先要注意Flag的动态设置方式,优先级高于静态方式(通过AndroidManifest.xml设置)。如果这两种设置方式混合在一起,则Activity启动过程、最终效果要分为多种情况来考虑。
其次,从非Activity组件例如Service启动Activity时,必须添加FLAG_ACTIVITY_NEW_TASK这个Flag。可以思考下,系统这样设计的原因?
再次,由于部分启动模式在启动Activity时,有时候并不会重新创建一个实例,也就不会调用其onCreate方法,而是回调onNewIntent方法,如果在启动时需要根据Intent重新加载数据,注意在onNewIntent中添加对应的处理。由于Activity在某些情况下,可能会被系统销毁,为了保险,Intent获取数据的处理,最好在onCreate、onNewIntent这两个函数中都做添加。
最后,如果我们用了FLAG_ACTIVITY_CLEAR_TOP这个flag启动Activity,当栈内已有目标Activity实例时,系统的处理会分为两种情况:
a. 只设置了FLAG_ACTIVITY_CLEAR_TOP,系统会销毁目标Activity和它之上的所有Activity,重新创建目标Activity,并不调用其onNewIntent方法。
b. 设置了FLAG_ACTIVITY_CLEAR_TOP+FLAG_ACTIVITY_SINGLE_TOP,系统只销毁之上的所有Activity,复用目标Activity,调用onNewIntent方法,效果相当于设置FLAG_ACTIVITY_NEW_TASK,也就是singleTask模式。
补充,适合使用singleInstance启动模式的Activity,基本都具有高优先级、业务逻辑的交互相对简单,也就是与其他应用的交互场景不多。而singleTask模式更适用于那些具有一定频度的交互场景的Activity,例如图库、联系人、一些第三方App问问需要启动相机拍照,然后再返回,这时候如果使用singleInstance则会始终独占一个任务栈,体验不好。换句话说,启动模式的设计,本质就是为了优化窗口返回的层次关系,改善用户体验。这其中又涉及到了Android任务栈模型,在后面文章继续分析。
(相关完整且成体系的文章可参见本人原创的开源电子书《Android系统与性能优化》,地址:https://github.com/carylake/androidnotes)
Android组件体系之Activity启动模式解析的更多相关文章
- Android多任务切换与Activity启动模式SingleTask之间关系的分析
这里会以多个场景列子进行分析,在分析之前先了解一下基本的概念. Task任务:一系列Activity的集合,这些Activity以栈的形式进行排列(后进先出). 那在什么时候系统会新建一个Task任务 ...
- Android Activity 启动模式详解
最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...
- Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- 【转】Android总结篇系列:Activity启动模式(lauchMode)
[转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...
- AndroidのActivity启动模式
Activity启动模式 .概念 Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否 .属性 Activity的启 ...
- Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 Android启动模式Flags栈Task 目录(?)[+] 什么是栈 栈 ...
- 【转】Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 在学习Android的过程中,Intent是我们最常用Android用于进程内或进 ...
- Activity启动模式(GIF 动态演示)
本文首发在我的个人微信公众号:Android开发圈 引言 关于Activity的启动模式是面试高频问题,在平时开发中,作用也不小,所以还是很有必要搞懂这一块的知识.其实之前也有写过这个主题的文章,但是 ...
- Activity启动模式的深入分析
网上关于Activity启动模式的文章许多.可是看起来都千篇一律,看完之后我们都能理解这4种启动模式.只是官方api对singleTask这个启动模式解释有些争议,导致我事实上并没有真正理解这几种模式 ...
随机推荐
- PAT甲级专题|链表
PAT链表专题 关于PAT甲级的链表问题,主要内容 就是"建立链表" 所以第一步学会模拟链表,pat又不卡时间,这里用vector + 结构体,更简洁 模拟链表的普遍代码 cons ...
- react-starter-projects
react-starter-projects These are repositories that you copy and modify to create your own React app. ...
- 使用Docker测试静态网站
参考书籍 :第一本docker书[澳]James Turnbull 1.Sample网站的初始Dockerfile 文件目录如下: Dockerfile文件代码: 安装nginx 在容器中创建一个目 ...
- Bomb后端云使用
Bomb是后台云托管工具,在Bomb官网注册会员,即可免费使用后台数据库服务.https://www.bmob.cn/app/list 创建应用后,在设置里获取密钥.根据官方文档集成. 在集成后运行时 ...
- CSS_跳动的心
详细教程CSS3 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- I_want_all 2019训练记录
Team members StarHai binarycopycode Fly_White Caution 读题 数组第一维的访问速度比其他维速度快. 清空数组 乘法运算取模里面涉及到减法注意变为负数 ...
- HDU 6405 Make ZYB Happy(广义SAM)
It's known to all that ZYB is godlike, so obviously he has a large number of titles, such as jskingj ...
- 【python3】Python十行代码搞定文字转语音
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:万能搜吧 都是copy的百度SDK文档,简单说说怎么用. 1.没安装Py ...
- Linux环境(服务器)下非root用户安装Python3.6
Linux环境(服务器)下非root用户安装Python3.6 在管理实验室集群时候,遇到的问题--非root用户在搭建自己环境时候,如何搭建. 注意: root用户的根目录是root,非root用户 ...
- 写入Apache Hudi数据集
这一节我们将介绍使用DeltaStreamer工具从外部源甚至其他Hudi数据集摄取新更改的方法, 以及通过使用Hudi数据源的upserts加快大型Spark作业的方法. 对于此类数据集,我们可以使 ...