Android Activity 的启动模式(Launch Mode)

2024-08-27 07:52

本文主要是介绍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)

这篇关于Android Activity 的启动模式(Launch Mode)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111078

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.