当前位置: 首页 > news >正文

Android Activity 的启动模式(Launch Mode)

1.  什么是 Activity 的启动模式?

Activity 的启动模式决定了在启动一个 Activity 时,它在任务栈中的行为。任务栈(Task Stack)是一个先进后出的堆栈结构,管理着应用中的 Activity。通过配置启动模式,我们可以控制 Activity 在任务栈中的实例化和复用行为,从而优化用户体验和应用性能 

2. 四种启动模式详解

  • standard 

    ------------------------| Activity A           |------------------------| Activity B           |------------------------| Activity A           |------------------------

这是默认的启动模式。每次启动 Activity 时都会创建一个新的实例,并将其推入任务栈中。

特点:

  • 每次启动都会创建新的实例。
  • 每个实例都会有一个独立的生命周期。

使用场景:

  • 适用于大多数需要多次实例化的 Activity,比如一个普通的详情页面。

示例:

<activity android:name=".StandardActivity"android:launchMode="standard" />
  • singleTop

如果要启动的 Activity 已经位于任务栈的栈顶,则不会创建新的实例,而是复用栈顶的实例,并调用其 onNewIntent 方法。

    ------------------------| Activity A           |------------------------| Activity B           |------------------------| Activity A (复用)     |------------------------

特点:

  • 如果 Activity 已在栈顶,则复用该实例。
  • 否则,创建新的实例。

使用场景:

  • 适用于频繁跳转回同一页面的情况,比如通知点击后打开的页面。

示例:

<activity android:name=".SingleTopActivity"android:launchMode="singleTop" />
  • singleTask

如果要启动的 Activity 在任务栈中已经存在,则会复用该实例,并将其上的所有其他 Activity 移出栈外,同时调用 onNewIntent 方法。

    ------------------------| Activity A           |------------------------| Activity B           |------------------------| Activity C           |------------------------| Activity A (复用)     |------------------------

特点:

  • 复用任务栈中已有的实例。
  • 清除该实例之上的所有 Activity。

使用场景:

  • 适用于需要确保某个 Activity 只有一个实例的情况,比如应用的主页面。

示例:

<activity android:name=".SingleTaskActivity"android:launchMode="singleTask" />

  • singleInstance

这种模式类似于 singleTask,但它会为该 Activity 创建一个单独的任务栈,并且该栈中只能有这一个 Activity 实例。

    独立任务栈:------------------------| Activity A (独立)     |------------------------

特点:

  • 复用独立任务栈中的唯一实例。
  • 该任务栈中只能有这一个 Activity。

使用场景:

  • 适用于需要独立任务栈的特殊页面,比如视频播放或电话拨号页面。

示例:

<activity android:name=".SingleInstanceActivity"android:launchMode="singleInstance" />

3. 如何在 AndroidManifest.xml 中配置启动模式

在 AndroidManifest.xml 文件中可以通过 android:launchMode 属性配置 Activity 的启动模式。

示例:

<application ... ><activity android:name=".MainActivity"android:launchMode="singleTask"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>
</application>

4. 使用 Intent Flags 控制启动模式

除了在 AndroidManifest.xml 中配置启动模式,还可以通过 Intent 的 flags 动态控制 Activity 的启动行为。

常用的 flags:

  • FLAG_ACTIVITY_NEW_TASK
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_CLEAR_TOP

示例:

val intent = Intent(this, SingleTopActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
startActivity(intent)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • echarts倾斜横向堆叠柱状图
  • Spring系列之Spring Cache缓存注解的使用
  • 《第二十八章:性能优化 - 电量优化》
  • Java | Leetcode Java题解之第371题两整数之和
  • 云原生系列 - Nginx(高级篇)
  • 【Linux】分析一段oom及oops报错日志
  • MySQL(面试篇)
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • ‘asyncio‘ with OpenAI API Call Hangs After Extended Run Time
  • 【AI】阿里云AI开发平台PAI:构建智能未来
  • clickhouse 原理详解
  • Spring不是引入了三级缓存,解决了循环依赖的问题吗?
  • 面试中的SEO优化:从基本概念到实用策略
  • JavaSE 面试题 46-50
  • 力扣题解(跳跃游戏II)
  • 「译」Node.js Streams 基础
  • 【Leetcode】104. 二叉树的最大深度
  • Bootstrap JS插件Alert源码分析
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • ES6--对象的扩展
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • mysql常用命令汇总
  • quasar-framework cnodejs社区
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 猴子数据域名防封接口降低小说被封的风险
  • 看域名解析域名安全对SEO的影响
  • 爬虫模拟登陆 SegmentFault
  • 如何学习JavaEE,项目又该如何做?
  • 微信小程序开发问题汇总
  • PostgreSQL之连接数修改
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (1)虚拟机的安装与使用,linux系统安装
  • (12)Linux 常见的三种进程状态
  • (8)STL算法之替换
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (十六)Flask之蓝图
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ***原理与防范
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NetCore部署微服务(二)
  • .NET大文件上传知识整理
  • .Net的DataSet直接与SQL2005交互
  • .net开发引用程序集提示没有强名称的解决办法
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • /3GB和/USERVA开关
  • @Autowired标签与 @Resource标签 的区别
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]