Android实战——Activity超详细学习笔记
一、Activity简介
Activity是四大组件中最重要的一个,也是平时开发中接触最多的。与Activity启动行为相关的就是它的启动模式,Standard、SingleTop、SingleTask、SingleInstance这4种launchMode相信大家不陌生。
OK,熟悉了4种launchMode后相信你已经对Activity任务栈有一些理解了,能应对一些常见的开发场景了。然而,除了4种launchMode,还有更复杂的控制Activity行为的方式,那就是给启动Activity的Intent添加flag,使用 Intent.addFlags(int flags) 方法。
看一下这个方法的参数,总共有20种:
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT,Intent.FLAG_ACTIVITY_CLEAR_TASK,Intent.FLAG_ACTIVITY_CLEAR_TOP,Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,Intent.FLAG_ACTIVITY_FORWARD_RESULT,Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY,Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT,Intent.FLAG_ACTIVITY_MULTIPLE_TASK,Intent.FLAG_ACTIVITY_NEW_DOCUMENT,Intent.FLAG_ACTIVITY_NEW_TASK,Intent.FLAG_ACTIVITY_NO_ANIMATION,Intent.FLAG_ACTIVITY_NO_HISTORY,Intent.FLAG_ACTIVITY_NO_USER_ACTION,Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP,Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS,Intent.FLAG_ACTIVITY_SINGLE_TOP,Intent.FLAG_ACTIVITY_TASK_ON_HOME,
这么多估计大家一看就晕了,我一开始也是这样。不过,仔细看每一条的文档,把它添加到你要启动的Activity上,然后观察Activity的行为,这样就容易弄明白它的含义。
二、任务栈相关概念
在分析具体的flag之前,介绍一些Activity任务栈相关的概念:Activity、task、tasks、recent tasks list。这些概念都是抽象的,除了Activity和recent tasks list看得见之外,其他都是看不见摸不着的。
如果没有直观的视觉感受,即使我说得天花乱坠你也可能还是云里雾里,而有了图甚至动画直接展示它们就不一样了。下面这个工具能很好地帮助我们:
https://github.com/rome753/ActivityTaskView
有了ActivityTaskView,就能结合图来分析了。
1、Activity 活动,这个就不用解释了
2、task 任务
它是应用中的放置活动的一个类似于栈的结构。栈顶的是最上面的活动,也就是用户直接看到的页面,顶部以下的活动都处于onStop状态(如果是可见的,那么处于onPause状态)。一般连续按返回键能自顶向下销毁活动。上图中的悬浮窗表示一个任务,在这个任务中启动了20多个活动。
3. tasks 一个应用的所有任务
虽然单个task是比较常见的应用,但是一个应用可以有多个task,创建新的task有好几种方法。
4. recent tasks list 最近任务列表
老的安卓系统中长按home键出现的页面,新的系统直接按导航栏中的正方形按钮。这个列表表示最近启动的应用的tasks,表中每一项表示一个入口。需要注意的是,一个应用可能会出现多个入口,因为应用可能有多个任务,当然不一定每个任务都会出现在列表中。
三、常用flag
1、FLAG_ACTIVITY_NEW_TASK
设置这个flag,新启动的activity就会被放置到一个新的任务当中(与"singleTask"有点类似,但不完全一样),当然这里讨论的还是启动其他应用程序的activity。这个flag的作用通常是模拟一种Launcher的行为,即列出一推可以启动的东西,但启动的每一个Activity都是在运行在自己独立的任务当中的。
2、FLAG_ACTIVITY_CLEAR_TOP
设置了这个flag,如果要启动的Activity在当前任务中已经存在了,并且还处于栈顶的位置,那么就不会再次创建这个Activity的实例,而是直接调用它的onNewIntent()方法。这种flag和在launchMode中指定"singleTop"模式所实现的效果是一样的。
3、FLAG_ACTIVITY_SINGLE_TOP
设置了这个flag,如果要启动的Activity在当前任务中已经存在了,就不会再次创建这个Activity的实例,而是会把这个Activity之上的所有Activity全部关闭掉。比如说,一个任务当中有A、B、C、D四个Activity,然后D调用了startActivity()方法来启动B,并将flag指定成FLAG_ACTIVITY_CLEAR_TOP,那么此时C和D就会被关闭掉,现在返回栈中就只剩下A和B了。
四、结束当前Activity
方法1
finish();
方法2
System.exit(0);
方法3
android.os.Process.killProcess(android.os.Process.myPid());
方法4
this.onDestory();
五、Intent跳转Activity
1、假设目前已经启动了3个Activity,分别叫做FirstActivity,SecondActivity,ThirdActivity,现在想在ThirdActivity中跳转至FirstActivity,即再启动一个FirstActivity,但不是变成1,2,3,1,而是变成1,即销毁掉中间所有的activity,同时要求保留FirstActivity上的数据。
Intent intent = new Intent(this,FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//关掉所要到的界面中间的activity
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//设置不要刷新将要跳转的界面
startActivity(intent);
2、与1类似,假设目前已经启动了3个Activity,分别叫做FirstActivity,SecondActivity,ThirdActivity,现在想在ThirdActivity中跳转至FirstActivity,即再启动一个FirstActivity,但不是变成1,2,3,1,而是变成1,即销毁掉中间所有的activity,这里要求不保留FirstActivity上的数据。
Intent intent = new Intent(this,FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//关掉所要到的界面中间的activity
startActivity(intent);
3、假设目前已经启动了3个Activity,分别叫做FirstActivity,SecondActivity,ThirdActivity,现在想在
Intent intent = new Intent(this,FirstActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
参考文章:
https://zhuanlan.zhihu.com/p/23704495
https://www.jianshu.com/p/2bdc16cba04f
https://blog.csdn.net/xkc_0706/article/details/50267765
Android实战——Activity超详细学习笔记相关推荐
- Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
所有示例使用的数据表均为Oracle提供的SQL基础数据表(t_employees.sql dept.sql emp.sql salgrade.sql) 熟练掌握多多练习即可达到完成后端开发所需具备的 ...
- 【台大郭彦甫】Matlab入门教程超详细学习笔记二:基本操作与矩阵运算(附PPT链接)
Matlab入门教程超详细学习笔记二:基本操作与矩阵运算 前言 一.基本操作 1.把matlab当作计算器使用 2.变量 3.控制格式输出 二.矩阵运算 1.矩阵 2.矩阵索引 3.使用:创建向量 4 ...
- 陈宝林《最优化理论与算法》超详细学习笔记 (八)————最优性条件
陈宝林<最优化理论与算法>超详细学习笔记 (八)----最优性条件 无约束问题的极值条件 必要条件 二阶充分条件 充要条件 约束极值问题的最优性条件 不等式约束的一阶最优性条件 无约束问题 ...
- 陈宝林《最优化理论与算法》超详细学习笔记 (七)————第五章 运输问题
陈宝林<最优化理论与算法>超详细学习笔记 (七)----第五章 运输问题 第1节 运输问题的数学模型 第2节 表上作业法 2.1 确定初始基可行解 2.2 最优解的判别 2.3 改进的方法 ...
- 陈宝林《最优化理论与算法》超详细学习笔记 (四)————第四章 对偶理论
陈宝林<最优化理论与算法>超详细学习笔记 (四)----第四章 对偶理论 1. 对偶问题的提出 2. 线性规划的对偶理论 2.1 原问题与对偶问题的关系 2.2 对偶问题的基本性质 3. ...
- 陈宝林《最优化理论与算法》超详细学习笔记 (一)————第十章 使用导数的最优化方法(最速下降法、牛顿法、阻尼牛顿法)
陈宝林<最优化理论与算法>超详细学习笔记 (一)----第十章 使用导数的最优化方法(最速下降法.牛顿法.阻尼牛顿法) 写在前面 第十章 使用导数的最优化方法 最速下降法 牛顿法 阻尼牛顿 ...
- 陈宝林《最优化理论与算法》超详细学习笔记 (五)————最优性条件 之 KKT条件
陈宝林<最优化理论与算法>超详细学习笔记 (五)----最优性条件 之 KKT条件 Lagrange对偶问题 原问题 Lagrange函数 Lagrange对偶函数 强/弱对偶性 弱对偶性 ...
- 陈宝林《最优化理论与算法》超详细学习笔记 (二)————补充知识(凸集) 第二章 线性规划的基本性质
陈宝林<最优化理论与算法>超详细学习笔记 (二)----补充知识 凸集 & 第二章 线性规划的基本性质 补充知识 凸集 方向与极方向 表示定理 择一定理 第一章 线性规划的基本性质 ...
- 陈宝林《最优化理论与算法》超详细学习笔记 (三)————单纯形法
陈宝林<最优化理论与算法>详细学习笔记 (三)----单纯形法 数学模型 最优性检验与解的判别 最优解的判别定理 无穷多最优解判别定理 无界解判别定理 其他情形 第三章 单纯形法 单纯形表 ...
最新文章
- 解决bootstrap下的图片自适应问题
- 自己的mongodb的CRUD封装
- ca服务器证书鉴定计划,Let’s Encrypt 项目计划自动化地提供免费的 CA 证书
- CountDownLatch 初识
- 数据结构--图(Graph)详解(二)
- 爬虫-例子-飞机图片的提取-抓取一个文章中的全部图片
- MySQL step by step 安装实战
- [外包]!采用asp.net core 快速构建小型创业公司后台管理系统(四.quartz 简单配置使用)...
- android fastboot 工具,fastboot工具中文帮助文档
- 当一个女生说她要减肥的时候
- 动手学深度学习——目标检测 SSD R-CNN Fast R-CNN Faster R-CNN Mask R-CNN
- windows7家庭普通版 添加 gpedit 组策略
- 云原生之下,百度智能云Palo如何驰骋大数据疆场?
- 热爱生活热爱工作才是第一位的
- python能干啥是什么意思_这年头不懂点Python都不好意思说是码农 神奇的Python都能干啥...
- 微软研究院分享:计算机专业求职的正确姿势
- ethereum-etl学习3
- Linux的体系结构
- 东华理工大学计算机考研资料汇总
- connectify-me破解
热门文章
- cmake使用教程(五)调用opencv外部库和自己生成的库
- phpstudy安装ssl证书_给网站安装免费SSL证书
- navicat如何配置链接mysql并且新建数据库设置字符集和排列规则
- 微信大改版,更新前必看的4个东西
- vue 判断权限过期_vue 路由权限
- 计算机国三网络技术,计算机国三网络技术.doc
- Oracle的权限角色及用户
- 130242014060-郑佳敏-第3次实验
- hadoop2.X集群安装与应用
- python 编码报错问题 'ascii' codec can't encode characters 解决方法