Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?

news2025/8/9 19:22:27

在这里插入图片描述

经典回答

这应该是一道很虐人的面试题,很多人都答不上来,很多人根本就没有用过。当我发现在被我面试的人中有80%的比例对它不了解时,我找过一些同事讨论是否还有在面试中考查这个问题的必要,得到的回答是“程序员何苦为难程序员”!

因为很多程序员都认为这个启动模式没有多大用处。好吧,我用一个实际中很容易遇到的问题来引出它有多么有用。

很多人在使用 startActivityForResult 启动一个 Activity 时,会发现还没有开始界面跳转本身的
onActivityResult 马上就被执行了,这是为什么呢?

遇到过吧,我见过很多人为了这个问题抓耳挠腮的。在 Activity.java 的 startActivityForResult 方法上看一下官方的说明吧:

     * <p>Note that this method should only be used with Intent protocols
     * that are defined to return a result.  In other protocols (such as
     * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
     * not get the result when you expect.  For example, if the activity you
     * are launching uses the singleTask launch mode, it will not run in your
     * task and thus you will immediately receive a cancel result.

很多人出现这个问题,确实是因为 startActivityForResult 启动的 Activity 设置了 singleTask 的启动模式。但是,除了这种情况还有可能会马上执行吗?

有,而且很多。如下面表格,左边第1列代表 MainActivity 的启动模式,第一行代表 SecondActivity(即要 startActivityForResult 启动的 Activity)的启动模式,打叉代表在这种组合下 onActivityResult 会被马上调用。

standsingleTopsingleTasksingleInstance
xx
xx
xx
xxxx

好在幸运的是,Android 在 5.0 及以后的版本修改了这个限制。也就是说上面x的地方全部变成了√。

那么在Android 5.0后,还会有这个问题吗?

还是会的。如在 Intent 中设置了 FLAG_ACTIVITY_NEW_TASK再startActivityForResult ,即使是标准的启动模式仍然会有这个问题。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Log如下:

I/MainActivity: onCreate
I/MainActivity: onResume
I/MainActivity: onPause
I/MainActivity: onActivityResult requestCode=1 resultCode=0
I/MainActivity: onResume
I/MainActivity: onPause
I/SecondActivity: onCreate
I/SecondActivity: onResume

注意:MainActivity的onResume 也会被触发。因为onActivityResult
被执行时,它会重新获得焦点。很多人也会遇到 onResume 被无故调用,也许就是这种情况。

所以,最终我们发现只要是不和原来的Activity在同一个 Task 就会产生这种立即执行 onActivityResult 的情况,从原代码也可以得到验证,详情查看ActivityStackSupervisor.java。

        if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0
                && r.resultTo.task.stack != null) {
            // For whatever reason this activity is being launched into a new
            // task...  yet the caller has requested a result back.  Well, that
            // is pretty messed up, so instead immediately send back a cancel
            // and let the new task continue launched as normal without a
            // dependency on its originator.
            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
            r.resultTo.task.stack.sendActivityResultLocked(-1,
                    r.resultTo, r.resultWho, r.requestCode,
                    Activity.RESULT_CANCELED, null);
            r.resultTo = null;
        }

原因

其实上面代码中的英文注解也说得很清楚了,Android 认为不同的Task之间对这种要求返回结果的启动方式会产生一些依赖(对Task),所以干脆简单粗暴在跳转前直接返回 RESULT_CANCELED 结果。

我们还是用一个例子简单解释一下,如下图,有两个任务栈(stack),处于前可视状态的是“Back Stack”也叫返回栈,处理后台的是“Background Task”。

image.png

当“Activity 2”通过 startActivityForResult 启动“Activity Y”时,“Background Task”中的Activity会被压入返回栈的栈顶。这种情况下,如果没有在跳转前直接返回 RESULT_CANCELED 给“Activity 2”,那么按Back键,应该要跳转到“Activity X”,而按Back键“Activity Y”就会调用finish会发送Result给启动它的“Activity 2”。这时就很难搞清楚,到底是“Activity 2”还是“Activity X”应该获得焦点了,会产生一些混乱或是违反的原有的一些约定。

你的朋友是不是也在准备面试呢?你可以“请朋友读”,把今天的题目分享给好友,或许你能帮到他。

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

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

相关文章

网络面试题总结

IO协议 问题一:如何理解IP的不可靠和无连接 不可靠:指的是不能保证数据包能成功地到达目的地。发生错误的时候,丢弃该数据包,发送ICMP消息给信源端。可靠性由上层提供。无连接: :IP 不维护关于后续数据报的状态信息。 体现在,IP 数据可以不按顺序发送和接收。A 发送连续…

信息安全工程实践笔记--Day2 暴力破解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录实验目标一、弱口令分类1.系统服务弱口令2.设备弱口令3.社工型的弱口令二、弱口令的攻击方式暴力破解获取密码的方式三、bp实操1.bp模块讲解1.sniper&#xff08;狙击…

跨平台下移动应用的开发框架对比与分析

当前由于移动互联网技术的日益发展&#xff0c;人们对移动互联网程序的要求也是越来越高&#xff0c;以往的互联网程序已经不能满足人们日益增长的需求&#xff0c;对此相关的工作技术人员要不断努力&#xff0c;研发出与时俱进的移动互联网程序。 近些年来由于平板电脑、智能…

【HTML5】调查问卷制作简约版

当你第一次使用CSS时候 目录 1、调查问卷网页展示及源码 1.1html源码 1.2css源码 2、form表单属性的用法 2.1date属性 2.2radio属性 2.3checkbox属性 2.4textarea标签 2.5required属性 2.6button标签 前言&#xff1a; 大家好&#xff0c;我是拳击哥带你捶键盘。首先感…

是前端受欢迎,不是你学了前端你就受欢迎好吧

☆ 这几天世界杯真是爆冷啊&#xff0c;也许是这届世界杯是冬天举办的原因吧。 ☆ 昨晚的德国对日本&#xff0c;日本做为亚洲小组冲出的第一名&#xff0c;实力强没有问题。而且我从小就看《足球小子》&#xff0c;大空翼深入人心啊。还记得那个动画片&#xff0c;放了学赶紧回…

运营版uniapp多商户商城小程序+H5+APP+商家入驻短视频社区种草直播阶梯拼团

运营版uniapp多商户商城小程序H5APP商家入驻短视频社区种草直播阶梯拼团 前后端全套源码&#xff0c; 支持二次开发&#xff0c;代码无加密&#xff01; 独立商家后台 用于店铺商品管理订单管理发货管理等 多类经营模式 多商家B2B2C、自营B2C运营模式 私有化部署 前端Uni…

Unity编辑器拓展最全实现

1编辑器顶部菜单学习 验证事项 2编辑器Scene菜单学习 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;public class TestSceneMenu : MonoBehaviour { [InitializeOnLoadMethod] //加入这个属性&#xff0c;就相当于…

7.前端笔记-CSS-元素显示模式

HTML元素分为块元素和行内元素两种类型 1、块元素 常见的块元素&#xff1a; <h1>~<h6> <p> <div> <ul> <ol> <li>块元素的特点&#xff1a; &#xff08;1&#xff09;独占一行 &#xff08;2&#xff09;高度、宽度、内外边距可…

java线程池详解

一 介绍 线程我们可以使用 new 的方式去创建&#xff0c;但如果并发的线程很多&#xff0c;每个线程执行的时间又不长&#xff0c;这样频繁的创建线程会大大的降低系统处理的效率&#xff0c;因为创建和销毁进程都需要消耗资源&#xff0c;线程池就是用来解决类似问题。 线程…

餐饮+KTV融合消费模式,会受消费者喜欢吗?

这个五一&#xff0c;我们雨科网门店系统的客户&#xff0c;大侠火锅店终于是将KTV搬到了自己的门店里&#xff0c;运用门店小程序功能及纸质代金券及礼品的噱头吸引客户进店&#xff0c;只需消费并和任意一人合唱一首歌即可领取&#xff0c;消费者在等餐或放松的时候一键点歌演…

一起来了解下 TOWER “未知装置”

从 2022 年 11 月 9 日开始&#xff0c;TOWER 未知装置可在 TOWER Token 网站&#xff08;https://www.crazydefenseheroes.com/fusion/game-assets&#xff09;上使用&#xff0c;允许玩家使用 TOWER Token 融合他们的 NFT 或将他们现有的 TOWER NFT 跟踪为不同的形式。 第一阶…

js - js中关于getBoundingClientRect()方法的使用

介绍一下getBoundingClientRect()方法的一些属性&#xff0c;以及具体的使用场景和一些需要注意的问题&#xff1b; 1&#xff0c;介绍 此方法返回元素的大小及其相对于视口的位置&#xff1b;返回的是一个对象&#xff1a; 包括 left、top、right、bottom、x、y、width 和 he…

ThinkPHP5目录结构

文章目录一、TP5的框架的下载1、[采用fastAdmin安装](https://www.fastadmin.net/download.html)2、Composer安装2.1 Composer提供的服务3、Git安装二、使用Composer安装后目录结构2.1 补充获取 Git 仓库git的工作机制一、TP5的框架的下载 1、采用fastAdmin安装 FastAdmin是一…

数据可视化大屏设计

在数据业务展示场景中&#xff0c;数据可视化大屏已经变得十分常见。那么在设计思路上&#xff0c;数据可视化大屏应当遵循什么样的设计逻辑&#xff1f;本篇文章里做了介绍&#xff0c;一起来看一下。 一、数据大屏的应用场景 1、大型会议 2、业务展示 二、数据大屏分类 1、展…

阿里云新用户滑块验证不过,阿里云滑动验证流程及线上问题排查

滑动验证是阿里巴巴集团提供的一种验证码解决方案&#xff0c;采用风险分析引擎&#xff0c;有效区分来自人类与机器人的访问行为并拦截机器风险&#xff0c;为您提供安全可靠的业务环境。 下图是滑动验证在用户客户端的展示效果。 产品介绍&#xff1a;阿里云验证码&#x…

5.XMLHttpRequest对象

XMLHttpRequest简称xhr&#xff0c;是浏览器提供的Javascript对象。之前我们使用的都是jQuery中的Ajax&#xff0c;现在我们使用原生JS的Ajax 目录 1 GET请求 1.1 不带参数请求 1.2 带参数请求 2 URL的编码与解码 2.1 编码 encodeURI() 2.2 解码 decodeURI() 3 …

计算机网络——TCP连接管理

本文将会介绍如何建立和拆除一条TCP连接&#xff0c;TCP的连接会显著的增加人们感受到的时延&#xff08;尤其是在Web冲浪时&#xff09;。同时一些常见的网络攻击SYN洪范攻击利用了TCP连接管理的弱点。 假定运行一台主机&#xff08;客户&#xff09;上的一个进程想和另一台主…

Spring中各种注解的使用说明汇总清单

目录 一、放在最开始方法的外侧的注解 1、ControllerAdvice&#xff1a; 2、ResponseBody 3、slf4j 4、Configuration 5、Component 6、Mapper 7、Service 8、RestController RequestMapping("/路径") 9、EnableTransactionManagement和Transactional&…

maven学习:maven安装、maven仓库、Idea配置maven

一、maven安装 1.1 下载maven Maven的版本对应的jdk和发布日期:Maven – Maven Releases History 到官方网站下载maven,网站: Maven – Download Apache Maven 如下图: 下载maven之前的版本:Index of /dist/maven/maven-3 注意&#xff1a; idea与maven的版本需要兼容, 所以我…

Python学的好,工作不愁找

俗话说的好&#xff1a;“Python学的好&#xff0c;工作不愁找”&#xff0c;不管我们学习哪一门语言&#xff0c;我们都要掌握从抽象化中提取出来的方法&#xff0c;这样你才能提高我们的学习能力&#xff0c;并且在学习新事物的时候可以提取我们自己的想法。学习Python&#…