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这个启动模式解释有些争议,导致我事实上并没有真正理解这几种模式 ...
随机推荐
- day20190916notes
记得学完知识,趁热打铁.认真看3遍,写抄写模仿3遍.记不得,就罚抄3遍.奖罚分明.自知之明.最重要的是看懂和理解代码.能自己看懂代码,多花时间和功夫. 只要功夫深,铁杵磨成针.确定一个努力的方向,坚持 ...
- RocketMQ 多副本前置篇:初探raft协议
目录 1.Leader选举 1.1 一轮投票中,只有一个节点发起投票的情况 1.2 一轮投票中,超过一个节点发起投票的情况 1.3 思考如何实现Raft选主 2.日志复制 Raft协议是分布式领域解决 ...
- flanneld 安装
目录 flanneld 安装 下载分发flanneld二进制文件 分发二进制文件到所有集群的节点 创建Flannel证书和私钥 创建证书签名请求 生成证书和私钥 向etcd写入Pod网段信息 创建fl ...
- 细说JVM内存模型
细说JVM内存模型 前言 在正式学习 JVM 内存模型之前,先注意以下几个是问题: JVM 内存模型与 JAVA 内存模型不是同一个概念.JVM 内存模型是从运行时数据区的结构的角度描述的概念:而 J ...
- CentOS 7 Nginx部署.NET Core Web应用
部署.NET Core运行时 必要前提 在安装.NET Core前,需要注册Microsoft签名秘钥并添加Microsoft产品提要,每台机器只需要注册一次,执行如下命令: sudo rpm -Uv ...
- mac 下面 vim 编辑器 开启语法高亮
cp /usr/share/vim/vimrc ~/.vimrc 拷贝默认的配置文件 vim ~/.vimrc 编辑该文件 在文件的最后加入 syntax on 保存退出即可
- php踩过的那些坑(2) strpos引发的血案
一.前方有坑 php某些自带函数,如果使用不当,也会坑得你人仰马翻.比如:strpos() 先了解一下strpos()函数是干啥的. strpos — 查找字符串首次出现的位置 用法: int str ...
- 我的第一个 python 爬虫脚本
#!/usr/bin/env python# coding=utf-8import urllib2from bs4 import BeautifulSoup #res = urllib.urlopen ...
- KETTLE教程实战
kettle初探 Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定.Kettle 中文名称叫水壶,该项目的主程 ...
- 吴裕雄--天生自然python学习笔记:python通过“任务计划程序”实现定时自动下载或更新运行 PM2.5 数据抓取程序数据
在 Windows 任务计划程序中,设置每隔 30 分钟自动抓取 PM2.5 数据,井保存 在 SQLite 数据库中 . import sqlite3,ast,requests,os from bs ...