对 FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP 的实践

news2024/9/21 18:57:13

对 FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP 的实践

前言

昨天编写了一篇博文: Activity启动模式与栈的使用小结,里面参考了下面这篇文章:

Android面试官装逼失败之:Activity的启动模式

对里面关于 FLAG_ACTIVITY_CLEAR_TOP| FLAG_ACTIVITY_NEW_TASK | singleTop 的描述有点困惑,而且昨天文章也没讲到 FLAG_ACTIVITY_CLEAR_TOP| FLAG_ACTIVITY_NEW_TASK 的情形,所以思来想去,还是写个DOMO来试试!

下面是该篇文章中的叙述:

如果同时使用了FLAG_ACTIVITY_NEW_TASK ,这个时候,目标是Activity自己所属的Task栈,如果在自己的Task中能找到一个Activity实例,则将其上面的及自身清理掉,之后重建。
1
FLAG_ACTIVITY_CLEAR_TOP| FLAG_ACTIVITY_NEW_TASK

如果同时在加上FLAG_ACTIVITY_SINGLE_TOP,会更特殊一些,如果topActivity不是目标Activity,就会去目标Task中去找,并唤起:
2
FLAG_ACTIVITY_CLEAR_TOP| FLAG_ACTIVITY_NEW_TASK| singleTop

如果topActivity是目标Activity,就直接回调topActivity的onNewIntent,无论topActivity是不是在目标Task中
3
FLAG_ACTIVITY_CLEAR_TOP| FLAG_ACTIVITY_NEW_TASK| singleTop

纸上得来终觉浅,绝知此事要躬行,下面我们就来试试,是不是和这篇文章说的一样。

准备工作

这里需要准备一些东西:代码、测试手机、adb命令。

代码其实很简单,只要创建A、B、C、D、E五个Activity,对它们设置不同的taskAffinity(这里taskAffinity居然还有格式要求),然后启动他们,如果要新开栈,需要配合FLAG_ACTIVITY_NEW_TASK跳转。

<activity android:name=".TestActivityA" android:taskAffinity="com.test.TestA"/>
<activity android:name=".TestActivityB" android:taskAffinity="com.test.TestA"/>
<activity android:name=".TestActivityC" android:taskAffinity="com.test.TestA"/>
<activity android:name=".TestActivityD" android:taskAffinity="com.test.TestB"/>
<activity android:name=".TestActivityE" android:taskAffinity="com.test.TestB"/>

测试手机我这用的荣耀10,鸿蒙2.0.0,安卓10,代码的compileSdkVersion=31,targetSdkVersion=30。

adb命令在网上找了很久,都没找到只显示堆栈的命令,下面第一种简洁但是堆栈信息不全,第二种是全了,但是要在一堆字符里面找,不过也不麻烦,下面用的第二种。

adb shell
// 第一种
dumpsys activity top | grep ACTIVITY
// 第二种
dumpsys activity activities

测试开始

测试FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP

Activity打开方式:

M(new task) -> A -> B -> C(new task) -> D -> F

堆栈信息:

Running activities (most recent first):
      TaskRecord{747baed #160 A=10913:com.test.TestB U=0 StackId=160 sz=2}
        Run #1: ActivityRecord{6f2f783 u0 com.silencefly96.fundark/.TestActivityF t160}
        Run #0: ActivityRecord{6f0a248 u0 com.silencefly96.fundark/.TestActivityD t160}

Running activities (most recent first):
      TaskRecord{747bac7 #159 A=10913:com.test.TestA U=0 StackId=159 sz=3}
        Run #2: ActivityRecord{6f0a3c2 u0 com.silencefly96.fundark/.TestActivityC t159}
        Run #1: ActivityRecord{72c5583 u0 com.silencefly96.fundark/.TestActivityB t159}
        Run #0: ActivityRecord{72c5544 u0 com.silencefly96.fundark/.TestActivityA t159}

Running activities (most recent first):
      TaskRecord{747bbab #158 A=10913:com.silencefly96.fundark U=0 StackId=158 sz=1}
        Run #0: ActivityRecord{7256f44 u0 com.silencefly96.fundark/.MainActivity t158}

接下来:

F(new task | clear top) -> B

堆栈信息:

Running activities (most recent first):
      TaskRecord{747bac7 #159 A=10913:com.test.TestA U=0 StackId=159 sz=2}
        Run #1: ActivityRecord{72733c2 u0 com.silencefly96.fundark/.TestActivityB t159}
        Run #0: ActivityRecord{72c5544 u0 com.silencefly96.fundark/.TestActivityA t159}

Running activities (most recent first):
      TaskRecord{747baed #160 A=10913:com.test.TestB U=0 StackId=160 sz=2}
        Run #1: ActivityRecord{6f2f783 u0 com.silencefly96.fundark/.TestActivityF t160}
        Run #0: ActivityRecord{6f0a248 u0 com.silencefly96.fundark/.TestActivityD t160}

Running activities (most recent first):
      TaskRecord{747bbab #158 A=10913:com.silencefly96.fundark U=0 StackId=158 sz=1}
        Run #0: ActivityRecord{7256f44 u0 com.silencefly96.fundark/.MainActivity t158}

果然,这里任务栈TestA代替TestB到了顶层,而TestActivityB的对象从72c5583变为了72733c2,上面的TestActivityC被清除了,还算符合我们的理解。

测试 FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP

接下来在上面的情况下,再加上FLAG_ACTIVITY_SINGLE_TOP,再试下复用情况:

M(new task) -> A -> B -> C(new task) -> D -> F

堆栈信息:

Running activities (most recent first):
      TaskRecord{7259aa1 #168 A=10913:com.test.TestB U=0 StackId=168 sz=2}
        Run #1: ActivityRecord{73c2344 u0 com.silencefly96.fundark/.TestActivityF t168}
        Run #0: ActivityRecord{7327848 u0 com.silencefly96.fundark/.TestActivityD t168}

Running activities (most recent first):
      TaskRecord{7259bab #167 A=10913:com.test.TestA U=0 StackId=167 sz=3}
        Run #2: ActivityRecord{73278c6 u0 com.silencefly96.fundark/.TestActivityC t167}
        Run #1: ActivityRecord{6f69409 u0 com.silencefly96.fundark/.TestActivityB t167}
        Run #0: ActivityRecord{7327983 u0 com.silencefly96.fundark/.TestActivityA t167}

Running activities (most recent first):
      TaskRecord{7259b39 #166 A=10913:com.silencefly96.fundark U=0 StackId=166 sz=1}
        Run #0: ActivityRecord{735a809 u0 com.silencefly96.fundark/.MainActivity t166}

F(new task | clear top | single top) -> B

堆栈信息:

Running activities (most recent first):
      TaskRecord{7259bab #167 A=10913:com.test.TestA U=0 StackId=167 sz=2}
        Run #1: ActivityRecord{6f69409 u0 com.silencefly96.fundark/.TestActivityB t167}
        Run #0: ActivityRecord{7327983 u0 com.silencefly96.fundark/.TestActivityA t167}

Running activities (most recent first):
      TaskRecord{7259aa1 #168 A=10913:com.test.TestB U=0 StackId=168 sz=2}
        Run #1: ActivityRecord{73c2344 u0 com.silencefly96.fundark/.TestActivityF t168}
        Run #0: ActivityRecord{7327848 u0 com.silencefly96.fundark/.TestActivityD t168}

Running activities (most recent first):
      TaskRecord{7259b39 #166 A=10913:com.silencefly96.fundark U=0 StackId=166 sz=1}
        Run #0: ActivityRecord{735a809 u0 com.silencefly96.fundark/.MainActivity t166}

果然又不出所料,TestActivityB复用了,并没有重新创建了,这里就和我们设置singleTask一样了,下面再看下那片文章说的topActivity问题。

测试测试 FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP 栈顶复用情况

M(new task) -> A -> B -> C(new task) -> D -> B

堆栈信息:

Running activities (most recent first):
      TaskRecord{70451ab #181 A=10913:com.test.TestB U=0 StackId=181 sz=2}
        Run #1: ActivityRecord{7366d83 u0 com.silencefly96.fundark/.TestActivityB t181}
        Run #0: ActivityRecord{7366d44 u0 com.silencefly96.fundark/.TestActivityD t181}

Running activities (most recent first):
      TaskRecord{7259aa1 #180 A=10913:com.test.TestA U=0 StackId=180 sz=3}
        Run #2: ActivityRecord{6d9a8c6 u0 com.silencefly96.fundark/.TestActivityC t180}
        Run #1: ActivityRecord{6f0a383 u0 com.silencefly96.fundark/.TestActivityB t180}
        Run #0: ActivityRecord{73c2383 u0 com.silencefly96.fundark/.TestActivityA t180}

Running activities (most recent first):
      TaskRecord{7259a55 #179 A=10913:com.silencefly96.fundark U=0 StackId=179 sz=1}
        Run #0: ActivityRecord{71b78c6 u0 com.silencefly96.fundark/.MainActivity t179}

这里我们从栈顶的B,去启动B,用上三个Flag,这里为了区分第一次B跳转,我用了长按跳转的。

B(new task | clear top | single top) -> B

堆栈信息:


Running activities (most recent first):
      TaskRecord{7259aa1 #180 A=10913:com.test.TestA U=0 StackId=180 sz=2}
        Run #1: ActivityRecord{6f0a383 u0 com.silencefly96.fundark/.TestActivityB t180}
        Run #0: ActivityRecord{73c2383 u0 com.silencefly96.fundark/.TestActivityA t180}

Running activities (most recent first):
      TaskRecord{70451ab #181 A=10913:com.test.TestB U=0 StackId=181 sz=2}
        Run #1: ActivityRecord{7366d83 u0 com.silencefly96.fundark/.TestActivityB t181}
        Run #0: ActivityRecord{7366d44 u0 com.silencefly96.fundark/.TestActivityD t181}

Running activities (most recent first):
      TaskRecord{7259a55 #179 A=10913:com.silencefly96.fundark U=0 StackId=179 sz=1}
        Run #0: ActivityRecord{71b78c6 u0 com.silencefly96.fundark/.MainActivity t179}

嗯?说好的复用topActivity呢?当Activity跳转动画不一样的时候我就觉得不对劲了。。这里还是复用了它对应taskAffinity的task,不过我看图里写的是singleTop?下面我又用singleTop试了下。

测试 FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | singleTop 栈顶复用情况

M(new task) -> A -> B -> C(new task) -> D -> B

堆栈信息:

Running activities (most recent first):
      TaskRecord{7045113 #186 A=10913:com.test.TestB U=0 StackId=186 sz=2}
        Run #1: ActivityRecord{6d30c87 u0 com.silencefly96.fundark/.TestActivityB t186}
        Run #0: ActivityRecord{6d30d44 u0 com.silencefly96.fundark/.TestActivityD t186}

Running activities (most recent first):
      TaskRecord{70450a1 #185 A=10913:com.test.TestA U=0 StackId=185 sz=3}
        Run #2: ActivityRecord{72cfcc6 u0 com.silencefly96.fundark/.TestActivityC t185}
        Run #1: ActivityRecord{7256e87 u0 com.silencefly96.fundark/.TestActivityB t185}
        Run #0: ActivityRecord{6b0c4c6 u0 com.silencefly96.fundark/.TestActivityA t185}

Running activities (most recent first):
      TaskRecord{7045185 #184 A=10913:com.silencefly96.fundark U=0 StackId=184 sz=1}
        Run #0: ActivityRecord{6f2f7c2 u0 com.silencefly96.fundark/.MainActivity t184}

B(new task | clear top) -> B

堆栈信息:

Running activities (most recent first):
      TaskRecord{70450a1 #185 A=10913:com.test.TestA U=0 StackId=185 sz=2}
        Run #1: ActivityRecord{7256e87 u0 com.silencefly96.fundark/.TestActivityB t185}
        Run #0: ActivityRecord{6b0c4c6 u0 com.silencefly96.fundark/.TestActivityA t185}

Running activities (most recent first):
      TaskRecord{7045113 #186 A=10913:com.test.TestB U=0 StackId=186 sz=2}
        Run #1: ActivityRecord{6d30c87 u0 com.silencefly96.fundark/.TestActivityB t186}
        Run #0: ActivityRecord{6d30d44 u0 com.silencefly96.fundark/.TestActivityD t186}

Running activities (most recent first):
      TaskRecord{7045185 #184 A=10913:com.silencefly96.fundark U=0 StackId=184 sz=1}
        Run #0: ActivityRecord{6f2f7c2 u0 com.silencefly96.fundark/.MainActivity t184}

还是一样的情况啊,那就是说这个topActivity的说法是不对的,FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP三个加起来就和singleTask是一样的。

小结

果然还是不能用博客学东西,需要自己多试试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是开源?

从开源空间&#xff08;Open Source Space&#xff09;说起开源空间&#xff08;Open Source Space&#xff09;&#xff1a;一个边界封闭&#xff0c;内部开放的空间。在这个空间里&#xff0c;人们围绕数字公共产品&#xff08;服务&#xff09;&#xff0c;进行开放式协作。…

零售数据分析之操作篇13:图表联动分析

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事。 上期回顾与作业讲解 上一讲讲了子查询的应用场景&#xff0c;即有一个结果集&#xff08;ds2&#xff09;的筛选条件是来自另外…

【C++】继承---上(继承的引入及使用详解、切片赋值和作用域)

前言&#xff1a; 我们在学习C的第一节课就了解到C是一门面向对象的语言&#xff0c;面向对象的语言有三大特性&#xff1a; 封装、继承、多态 此前我们学习了封装&#xff0c;比如模拟实现vector&#xff0c;string或者迭代器等&#xff0c;不仅有利于我们的维护和管理&#…

【uniapp】Vue3版本项目出现Proxy代理对象无法正常取值问题解决

习惯了使用Vue2版本的uniapp项目&#xff0c;直到后来想升级版本&#xff0c;改用Vue3版本就会遇到一些无法正常取值&#xff08;访问属性&#xff09;问题&#xff0c;其中最显著问题就是Proxy代理造成的 在我们用浏览器调试的时候&#xff0c;遇到如同下图这样&#xff0c;出…

Spring Boot 项目如何实现上传头像功能?

目录 设计思路 效果展示 ​编辑 分析 前后端交互接口 请求 响应 代码实现和详细注释 数据库设计 自定义资源映射 前后端交互 客户端开发 服务器开发 设计思路 效果展示 分析 实现这个功能只要弄清楚以下几点即可&#xff1a; 怎么将头像数据发送给服务器&#x…

九龙证券|服务器龙头获资金连续抢筹,尾盘主力抢筹前期大热门股

今天&#xff0c;核算机职业取得主力大手笔抢筹。 今天主力资金净流出53.89亿元&#xff0c;其间创业板净流出3.19亿元&#xff0c;沪深300成份股净流出7.61亿元。 申万一级职业中&#xff0c;今天有19个职业上涨&#xff0c;传媒职业接连两日均涨近5%&#xff0c;居首位&…

stm32当中GPIO输出知识点汇总(GPIO的八种模式及其原理)

一、GPIO工作模式. 1. 四种输入模式 GPIO_Mode_IN_FLOATING 浮空输入模式 GPIO_Mode_IPU 上拉输入模式 GPIO_Mode_IPD 下拉输入模式 GPIO_Mode_AIN 模拟输入模式 2. 四种输出模式 GPIO_Mode_Out_OD 开漏输出模式 GPIO_Mode_Out_PP 推挽输出模式 GPIO_Mod…

【剑指offer-C++】JZ79:判断是不是平衡二叉树

【剑指offer-C】JZ79&#xff1a;判断是不是平衡二叉树题目描述解题思路题目描述 描述&#xff1a;输入一棵节点数为 n 二叉树&#xff0c;判断该二叉树是否是平衡二叉树。 在这里&#xff0c;我们只需要考虑其平衡性&#xff0c;不需要考虑其是不是排序二叉树。 平衡二叉树…

Nginx实现负载均衡的多种方法演示

文章目录前言一、配置讲解1.1 轮询算法&#xff08;默认&#xff09;1.2 IP_HASH算法1.3 Weighted算法1.4 URL_HASH算法总结前言 Nginx是一款高性能的Web服务器和反向代理服务器,它具有占用内存小、并发处理能力强、稳定性高等优点&#xff0c;适用于高并发、高负载的Web应用场…

pandas之DataFrame基础

pandas之DataFrame基础1. DataFrame定义2. DataFrame的创建形式3. DataFrame的属性4. DataFrame的运算5. pandas访问相关操作5.1 使用 loc[]显示访问5.2 iloc[] 隐式访问5.3 总结6. 单层索引和多层级索引6.1 索引种类与使用6.2 索引相关设置6.3 索引构造6.4 索引访问6.5 索引变…

BGP选路实验(重点是各种策略)

实验拓扑 基础配置(完成IGP的配置) 首先完成各 个接口IP地址,环回接口地址等一些基本配置&#xff0c;实现直连之间的互相通信 在R4&#xff0c;R5上的配置类似 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [Huawei-GigabitEthernet0/0/0]int g0/0…

低代码是什么意思

此前&#xff0c;阿里云智能总裁张建锋曾在钉钉发布会上表示&#xff1a;“未来的软件开发一定是碎片化的&#xff0c;低代码开发将成为未来几年的行业关键词。”这句话表明了低代码在过去两年的火爆程度&#xff0c;预示着低代码有望成为软件领域的新风口。 那低代码是什么意…

chatgpt智能提效职场办公-excel表格6-6-6格式怎么设置(数字按照三个数字一组进行分隔)

chatgpt智能提效职场办公-excel表格6-6-6格式怎么设置&#xff08;数字按照三个数字一组进行分隔&#xff09; 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 在Excel表格中设置6-6-…

移除元素(数组篇)

27. 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

004:Mapbox GL设定不同的style,更换底图形态

第004个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中设定不同的style,更换底图形态 。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共70行)相关API参考:专栏目标示例效果

「业务架构」需求工程—需求规范(第3部分)

将用户和系统需求记录到文档中。需求规范它是将用户和系统需求写入文档的过程。需求应该是清晰的、容易理解的、完整的和一致的。在实践中&#xff0c;这是很难实现的&#xff0c;因为涉众以不同的方式解释需求&#xff0c;并且在需求中经常存在固有的冲突和不一致。正如我们之…

GraphInsight 拓扑图体验

蚂蚁数据可视化 | G6&#x1f4da;前言&#x1f4da;使用说明&#x1f4d5;数据规则节点的属性&#x1f4da;前言 蚂蚁数据可视化 G6 图可视化引擎是一个简单、易用、完备的图可视化引擎&#xff0c;它在高定制能力的基础上&#xff0c;提供了一系列设计优雅、便于使用的图可视…

1~3年的测试工程师薪资陷入了瓶颈期,如何突破自己实现涨薪?

对于技术人员而言&#xff0c;职业规划一般分为两个方向&#xff1a;做技术、做管理。进入软件测试行业的新人都会从最基础的执行开始&#xff0c;然后是基本的功能测试。 随后大家会根据个人职业发展来进一步细化&#xff0c;有的走管理路线&#xff0c;成为主管、经理、项目…

《操作系统》by李治军 | 实验3 - 系统调用

目录 一、实验内容 二、实验准备 1、系统调用的具体流程 &#xff08;一&#xff09;调用接口函数 API &#xff08;二&#xff09;触发 0x80 号中断 &#xff08;三&#xff09;跳转到 system_call 函数 &#xff08;四&#xff09;执行系统调用函数 sys_xxx 2、总结概…

19从零开始学Java之局部变量和成员变量是怎么回事?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前两篇文章中&#xff0c;壹哥给大家讲解了Java里的条件分支&#xff0c;包括if和switch两种情况。…