Activity的启动模式

Activity相关面试题 1、Activity的启动流程 Activity 启动主要涉及到3个进程: 系统进程 SystemServer (负责管理整个framework,是Zygote孵化的第一个进程) App进程(App进程是用户点击桌面icon时,通过Launcher进程请求SystemServer,再调用Zygote孵化的) Zygote进程(所有进程孵化都由Zygote完成,而Zygote是init进程的子进程,也由init进程孵化) 如果点击桌面icon启动还会涉及到 Launcher进程(Zygote孵化的第一个应用 阅读详情

题目:Activity的启动模式,区别

这道题想考察什么?
  1. 启动模式是什么?
  2. 启动模式如何设置?
  3. Activity的启动模式区别?
  4. 应用场景以及那些注意的点?
考察的知识点
  1. 启动任务,返回栈,启动模式的概念
  2. 启动模式设置方法以及区别
  3. 亲和性,多个任务
  4. 启动模式应用场景以及那些坑
考生应该如何回答
  1. 我们可以先讲一下从应用启动涉及到的activity堆栈流程以及四种启动模式概念

    一个应用由多个Activity构成,多个Activity构成了任务,系统以栈方式进行管理任务(也就是管理多个Activity),管理方式为“先进后出”。

    默认情况下,当用户点击App图标后,启动应用,这时会创建一个任务栈,并且将MAIN Activity压入栈中,作为栈底Activity。之后每启动一个Activity,就会将这个Activity压入栈中,显示处于栈顶的Activity。当用户点击“返回”键后,处于栈顶的Activity进行出栈销毁。

    Android提供四种Activity的启动模式来进行入栈操作。

    • standard:默认值,启动Activity都会重新创建一个Activity的实例进行入栈。此时Activity可能存在多个实例。
    • singleTop:当Activity处于栈顶时,再启动此Activity,不会重新创建实例入栈,而是会使用已存在的实例。
    • singleTask:根据taskAffinity去查找是否存在这个任务栈,默认情况下taskAffinity为应用package name,也就是应该默认创建的任务栈,之后在这个任务栈中查找是否存在Activity,当Activity在栈中已经存在,再启动此Activity,会使用已存在实例,并且会将栈中此Activity上面的所有Activity进行出栈销毁,使得此Activity处于栈顶。如果不存在taskAffinity相同的任务栈,则创建任务栈,并且将此Activity入栈。
    • singleInstance:启动的Activity,会重新创建一个任务栈,并且此任务栈中只有一个Activity。
  2. 然后从这两个方面说一下设置启动模式

    • AndroidMainfest.xml文件设置

    设置的lanuchMode属性。

    可设置四个值:standard、singleTop、singleTask、singleInstance。若不设置默认为standard。

    <activity 
       android:name=".activity.MainActivity"
       android:launchMode="standard"/>
    
    • Intent跳转标记Flag

    FLAG_ACTIVITY_SINGLE_TOP 等价于 singleTop。位于栈顶的Activity会重用实例,调用onNewIntent函数接收intent。

    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    

    FLAG_ACTIVITY_SINGLE_NEW_TASK

    启动新的TASK,这个新的TASK取决于xml中设置的TaskAffinity(亲和性)属性。

    首先去寻找是否存在相同亲和性的任务,如果存在,那么直接将这个Activity加入到这个任务中。若不存在,则新建一个任务来加入Activity。

    FLAG_ACTIVITY_CLEAR_TOP

    会将位于此Activity上放的Activity进行出栈销毁。

    // singleTask的行为可使用代码表示为
    Intent intent = new Intent(this, MainActivity.class);
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    

    两者区别:

    xml设置为静态的,intent标记是动态的。

    intent标记Flag的优先级更高一些。所以当标记Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP后,尽管Activity为默认的standard模式,也同样会使用存在的实例,调用onNewIntent。

  3. 再讲一讲亲和性和多个任务并存

    亲和性是指Activity设置在AndroidMainfest.xml中的taskAffinity属性。相同亲和性的Activity在同一个任务中,默认使用application的taskAffinity,也就是package name。

    并不是设置taskAffinity就一定起作用,起作用是有条件的:

    1. 同时设置了launchMode属性为singleTask。
    2. Intent跳转时使用FLAG_ACTIVITY_NEW_TASK。
    3. 同时设置allowTaskReparenting属性为true。

    allowTaskReparenting可以使此Activity从启动任务中转移到该taskAffinity的任务中。此时需要发生Task reset(回到Home之后再进入app)才能看出效果。

    不同亲和性意味着不同的任务,也就是同一个app中可以存在不同的任务,前台显示的任务的栈顶Activity为用户可见的Activity。当启动一个新的任务时,新的任务会覆盖当前任务。并且回退时,一个任务中Activity全部出栈,会将后台的任务调出,知道最后一任务的最后一个Activity出栈,app结束,回到Home。

    例如:一个应用有Main、A、B、C四个Activity,C的lanuchMode为singleTask,并且taskAffinity设置为.c,其他都为默认,那么按照启动顺序:

    Main->A->B->C

    此时存在两个task:

    默认:Main->A->B (后台)

    .c:C (前台)

    由C启动A,那么此时task为:

    默认:Main->A->B->A (前台)

    .c:C (后台)

    按回退键:出栈顺序为:
    A、B、A、Main、C

  4. 最后说一下,应用场景以及需要避免的坑

    1. 新闻客户端的推送,点击打开新闻详情页,此时新闻详情页应该设置singleTop,避免用户在新闻详情页打开推送通知,使得回退出现两次详情页。
    2. 利用singleTask的特性,可以使得应用完全退出。

    注意:闪屏也+主页+其他的应用,可以设置主页为singleTask,因为闪屏页展示完就finish掉,栈底存在主页,用户点击回退键可以直接关闭应用。

    坑:避免启动MAIN的MainActivity设置为singleTask,这样当用户点击HOME,再重新启动应用时,将始终展示MainActivity,并且此时MainActivity走onNewIntent方法。

    1. singleInstance使用比较少,系统应用比如打电话可使用singleInstance。
    2. singleTop、singleTask、singleInstance在使用已存在的Activity实例时,都将走onNewIntent方法。

相关视频:https://www.bilibili.com/video/BV1hZ4y1L7A9?spm_id_from=333.999.0.0

Android 面试总结 - Activity的启动流程(1),安卓开发必须会的技能 1.搭建知识框架可不是说你整理好要学习的知识顺序,然后看一遍理解了能复制粘贴就够了,大多都是需要你自己读懂源码和原理,能自己手写出来的。2.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要!最后你达到什么水平取决你消化了多少知识3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境。 阅读详情

相关推荐

Activity 启动模式

Flag FLAG_ACTIVITY_NEW_DOCUMENT FLAG_ACTIVITY_MULTIPLE_TASK FLAG_ACTIVITY_RETAIN_IN_RECENTSFlagFLAG_ACTIVITY_NEW_DOCUMENT 此处document 这个单词实在是不知道怎么翻译才恰当,document 本意就是文档,文件的意思,本文展示就翻译成文档的意思吧,我觉得这样稍微准确一点

KKkeep的专栏 1907

【Android面试题】Android Framework核心面试题——Activity启动流程分析

Activity的启动交由ATMS触发处理,在Activity启动前需要先在ActivityStarter类中解读包括Activity的启动模式在内的各种参数信息。确定好启动信息后通过创建一个黑白屏的方式反馈给用户一个信息:我们正在响应启动app的过程中。

datian1234的博客 748

ESD放电路径分析

当金属外壳接地情况下,大部分外部干扰信号将会通过外壳,外壳到接地点,再由接地点回到干扰信号的地,实现干扰信号的回流,这点不仅仅适用于​ESD,对于其他的RI类干扰,也同样适合。发现内部金属板跟外壳的搭接处存在较多的缝隙点,该缝隙点对于频率较高的信号能够实现较为理想的回流,但是对于频率没有那么高的信号,则较难以实现回流,我们尝试将这些缝隙用铜箔包裹住,充分降低该金属板跟外壳的接触阻抗​。我们分析,路径3其实是不期望的路径,我们最期望的路径是1,或者2的内部金属部件跟外壳良好接触情况下的路径。

domen_pan的博客 2228

当面试官要你说一下Activity的启动模式时,怎么回答最合适?标准答案在这里

导读 最近很多Android程序员都在找面试相关是文,其中很多人都问到了“Activity的启动模式”,很多人都表示自己的回答很难让面试官满意。 当面试官要你说一下Activity的启动模式时,怎么回答最合适?标准答案在下面,本文来自一位不愿透漏姓名的Android大佬。 (大家如果感兴趣,想向大佬请教问题,可以私信我,或者是评论区留言) 引言 当面试官说请你介绍一下activity启动模式,大多数人都能整两句,什么栈顶复用啊栈内复用啊。 不过,你确定你真的懂启动模式吗? 如果你能回答出下面的问题,那么你.

m0_46962786的博客 847

【PLL】分频器设计权衡:从CMOS到CML的电路实现与优化

本文深入探讨了PLL中分频器的设计权衡,比较了CMOS和CML两种电路实现的优缺点。通过实际案例分析,展示了如何在速度、功耗和噪声之间取得平衡,特别是在5G射频芯片和Wi-Fi 6E等高频应用中的优化实践。文章还提供了混合架构设计和电源噪声协同优化的实用技巧,适合电路设计工程师参考。

weixin_42521843的博客 442

零代码构建AI智能体:COZE可视化工作流实战指南

AI智能体(AI Agent)是当前人工智能领域的重要发展方向,它通过模块化设计和工作流驱动,使大语言模型从被动对话转向主动执行。其核心原理在于将复杂的任务分解为可规划、可执行的步骤,并调用外部工具(插件)完成闭环。这一技术价值在于显著降低了自动化流程的开发门槛,让非程序员也能构建实用的数字助手。典型的应用场景包括智能客服、内容自动生成、数据分析和跨系统业务流程自动化。本文以COZE平台为例,深入解析如何通过其直观的可视化界面和丰富的插件生态,像搭积木一样快速搭建如“早安简报生成器”等实用智能体,并分享指令

468

Activity的四种启动模式

系统默认的启动模式,栈结构,先进后出,打开一个activity入栈,再打开下个activity,接着入栈,我们平时直接创建的Activity都是这种模式的Activity这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;如果要激活的那个Activity在任务栈

Ai1114的博客 4万+

RK3568平台YOLO11模型部署实战:从环境搭建、模型转换到板端性能优化全解析

摘要: 本文详细介绍了在RK3568平台上从零部署YOLO11模型的完整流程。主要内容包括:1) 基于Conda搭建Python 3.8开发环境并安装RKNN-Toolkit2工具链;2) 使用LabelImg工具标注数据并构建YOLO格式数据集;3) 基于Ultralytics框架进行YOLO11模型训练及参数优化;4) 实现PyTorch→ONNX→RKNN的完整模型转换链。文章特别针对RK3568平台的NPU特性提供了关键参数配置建议,并分享了实际开发中的经验总结,最终可达到30FPS的稳定推理性能。

LXY_LOVE36的博客 280

Activity的四种启动模式深入解析

Activity的四种启动模式深入解析

似霰的博客 4576

【大模型】从0到1:DeepSeek + Coze API调用全攻略,企业,开发个人专属AI智能体使用详解,小白也能轻松上手

本文介绍了如何通过API将Coze智能体集成到自有系统中的完整步骤:1)获取API token和个人工作空间的space_id;2)通过GET请求获取bot_id;3)使用POST发起对话请求,需包含bot_id、user_id和问题内容;4)通过两次API调用异步获取响应消息。文章还解释了Coze采用异步处理机制的原因,并预告了下期将讲解Java调用Coze接口的实现方法。整个过程需要使用API工具进行调试,确保了系统集成的可行性。

qq_27246521的博客 822

YOLOv11改进 | Conv篇 | 2024最新轻量化自适应提取模块LAE助力边缘设备部署计算(附代码 + 修改教程 + 运行教程)

本文给大家带来的一个改进机制是最新由LSM-YOLO提出的轻量化自适应特征提取(Lightweight Adaptive Extraction, LAE)模块,其是LSM-YOLO模型中的关键模块,旨在进行多尺度特征提取,同时降低计算成本。LAE通过以下方式实现更有效的特征提取:多尺度特征提取、自适应特征提取。LAE模块可以在不增加额外参数的情况下提高了模型对ROI区域的检测性能。​欢迎大家订阅我的专栏一起学习YOLO!YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍。

Snu77的博客 4055

【Android Activity】Activity的启动模式

安卓是采用任务栈来管理activity的,默认情况下多次启动同一个activity系统会重复创建这个activity的实例,并把每个实例依次入栈。为了避免activity实例的重复创建、应付特殊的场景、安卓为activity设计了启动模式。

dev晴天的博客 6895

09 SAP CPI 访问公共API接口

我在网上找了一个公共API,入参输入汉字返回拼音。至此,一个真正的访问API的接口就做好了。点击保存时可看到红叉报错。

SAP CPI 477

Activity启动模式

Activity启动模式 四种启动模式 1.standard 标准模式 **应用场景:**一般界面都是这个模式 这是Activity默认的启动模式,在每次启动的时候都会创建一个新的activity实例(不管这个实例之前是否被创建)。被创建实例的生命周期符合典型情况下的activity的生命周期。在这种模式下,谁启动了这个 Activity 那么这个 Activity 就运行在启动它的那个 Activity 所在的栈中。当非activity类型的context来使用这种模式来启动activity就会报错:

qq_52353404的博客 2322

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

二、Activity 的启动模式

一、四种启动模式: ① standard(标准模式) 这个是系统的默认模式。在这种模式下,每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在,并且谁启动了这个 Activity,那么这个 Activity 就运行在启动它的那个 Activity 所在的栈中。 eg: // FirstActivity.java Intent intent =...

丶一个有梦想的老实人 的博客 2396

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android Activity的四种启动模式

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。链接:https://pan.baidu.com/s/1BUbENbinlO0KpI5aQDA1JA?pwd=1234提取码:1234。

2401_87593563的博客 1514

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android——Activity的四种启动模式

简介: 我们一个程序会存在不同的Activity,也会存在许多实例,这些实例就会进入任务栈中,任务栈采用“后进先出”的算法,例如:我们使用手机,打开QQ,在QQ界面进入一个聊天界面,此时存在两个Activity实例,假设我们按一下back键我们将回到QQ主界面,在按一下back键我们将回到屏幕主界面,这就是“后进先出”。 Activity的四种启动模式 standard:系统默认使用此启动模式,特性:无论实例存在与否,每启动一次就创建一个实例,如下图所示 singleTop:此启动方法分为两种情况。 一

FranzLiszt的博客 2467

Activity启动模式探究

Activity启动模式

知识共享,你我皆是知识的搬运工 1145

Activity 的启动模式

任务栈代表的是一个整体,本身包含了多个Activity,当任务栈中的所有Activity都被弹出后,任务栈也就随之就被回收了。就像下图所示,三个Activity通过相继启动组成了一个任务栈,Activity1是整个任务栈的根Activity,当用户不断按返回键,Activity就会依次被弹出。

2501_90336313的博客 885
上一篇: 谈谈架构中的限流与计数器的实现方式
下一篇: Activity的启动模式,你了解多少
AndroidYingZi
博客等级 码龄6年 6粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值