Android 之 Activity 的启动模式(launchMode)

news2025/7/19 21:32:01

一、Activity 启动模式

在实际项目中,应该根据项目的实际需要来为每个 Activity 指定恰当的启动模式 launchMode。启动模式一共有四种,分别是 standard、singleTop、singleTask 和 singleInstance。可以在 AndroidManifest.xml 中通过给 <activity> 标签指定 android:launchMode 属性来选择启动模式。

1、standard

standard 是 Activity 默认的启动模式,在不进行显示指定的情况下,所以 Activity 都会自动使用这种启动模式。Android 是使用返回栈来管理 Activity 的,在 standard 模式下,每当启动一个新的 Activity,它就会在返回栈中入栈,并处于栈顶的位置。对于使用 standard 模式的 Activity,系统不会在乎这个 Activity 是否已经在返回栈中存在,每次启动都会创建一个该 Activity 的新实例。

package com.android.common.activity

import android.content.Intent
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.android.common.R

class FirstActivity: AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
        setContentView(R.layout.activity_main)
        Log.d("FirstActivity", this.toString())

        val button: Button = findViewById(R.id.button)
        button.setOnClickListener {
            val intent = Intent(this, FirstActivity::class.java)
            startActivity(intent)
        }
    }
}

上面为测试 standard 启动模式的代码,在 FirstActivity 界面上有一个 button 按钮,点击后再次打开 FirstActivity。每次点击按钮都会重新创建一个新的 FirstActivity 实例,点击3此,此时返回栈中也会存在 3 个 FirstActivity 实例,需要点击 3 次 Back 键才能退出程序。standard 模式原理示意图如下:

在这里插入图片描述

2、singleTop

当 Activity 的启动模式指定为 singleTop,在启动 Activity 时如果发现返回栈的栈顶已经是该 Activity,则认为可以直接使用它,不会再创建新的 Activity 实例。AndroidManifest.xml 中指定 Activity 的启动模式:

 		<activity android:name=".activity.FirstActivity"
            android:launchMode="singleTop" />

还是 standard 启动模式的例子,在 FirstActivity 中无论点击多少次,返回栈中始终只有一个 FirstActivity 的实例,只要按一次 Back 键就可以退出程序了。
不过当 FirstActivit 并未在栈顶位置时,再启动 FirstActivit 时还是会重新创建新的 FirstActivity 实例。例如,在 FirstActivity 中启动 SecondActivity,然后在 SecondActivity 中再启动 FirstActivity,由于此时栈顶已经不是 FirstActivity 了,所以此时启动 FirstActivity 时会重新创建新的实例,即使返回栈中已经存在 FirstActivity 的实例,该过程的原理示意图如下:

在这里插入图片描述

3、singleTask

使用 singleTask 模式可以很好地解决重复创建栈顶 Activity 的问题。当 Activity 的启动模式指定为 singleTask 时,每次启动该 Activity 时,系统首先会在返回栈中检查是否存在该 Activity 的实例,如果发现已经存在则直接使用该实例,并把在这个 Activity 之上的所有其他 Activity 统统出栈。如果没有发现就会创建一个新的 Activity 实例。
修改 AndroidManifest.xml 中 Activity 的启动模式:

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

假设有两个 Activity:FirstActivity 和 SecondActivity,在 FirstActivity 中点击按钮进入 SecondActivity,然后在 SecondActivity 中点击按钮启动 FirstActivity。在SendActivity中启动 FirstActivity 时,会发现返回栈中已经存在一个 FirstActivity,并且在 SecondActivity 下面,于是 SecondActivity 会从返回栈中出栈,而 FirstActivity 会重新成为栈顶的 Activity。现在返回栈中只剩下一个 FirstActivity 的实例了,按一下 Back 键就可以退出程序了。原理示意图如下:

在这里插入图片描述

4、singleInstance

如果一个 Activity 被多个程序共享时,采用之前的三种启动模式是做不到的,因为每个应用程序都会有自己的返回栈,同一个 Activity 在不同的返回栈中入栈时必然会创建新的实例。这种时候需要采用 singleInstance 启动模式,singleInstance 模式的 Activity 会启用一个新的返回栈来管理这个 Activity,不管是哪个应用程序来访问这个 Activity,都能共用同一个返回栈,也就解决了共享 Activity 实例的问题。
示例:在 FirstActivity 中点击按钮进入 SecondActivity 界面,然后在 SecondActivity 中点击按钮进入 ThirdActivity 界面,其中 SecondActivity 的启动方式指定为 singleInstance,原理示意图如下:

在这里插入图片描述

原理图上可以看出,指定为 singleInstance 启动模式的 SecondActivity 启动了一个新的返回栈。此时按下 Back 键进行返回,会发现 ThirdActivity 直接返回到了 FirstActivity,再按下 Back 键又会返回到 SecondActivity,再按下 Back 键才会退出程序。

二、应用场景

1、singleTop 的使用场景

  • 广播消息。当在 ActivityA 界面时,此时收到一条广播信息,要求打开 ActivityA 界面,此时就没必要再次创建一个新的 ActivityA 实例放在栈顶,否则退出 ActivityA 界面时就需要按两次 Back 键才能退出。
  • 微信的搜索功能。但点击搜索按钮后,微信就会跳到查询结果界面,在查询结果界面,为了能够继续查询,还是要显示搜索框,这种场景就需要用到 singleTop 启动模式,否则搜索几次就要按几次返回按钮才能回到主界面。

2、singleTask 的使用场景

该启动模式主要运用在主界面,无论后面打开了多少界面,只要再次回调主界面,返回栈中就应该只有一个主界面处于栈顶,否则退出程序时需要按多次退出按钮。

3、singleInstance 的使用场景

该模式主要用于 Activity 被多个应用程序共享时,无论哪个应用程序来访问这个 Activity,都共用同一个返回栈。

参考

《第一行代码 ——Android(第3版)》

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

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

相关文章

软考:系统架构设计师教材笔记(持续更新中)

教材中的知识点都会在。其实就是将教材中的废话删除&#xff0c;语言精练一下&#xff0c;内容比较多&#xff0c;没有标注重点 系统架构概述 定义 系统是指完成某一特定功能或一组功能所需要的组件集&#xff0c;而系统架构则是对所有组件的高层次结构表示&#xff0c;包括各…

大模型应用—IOPaint 图片去水印

IOPaint 是由 SOTA AI 模型提供支持的免费开源修复和修复工具,可以轻松实现图片去水印,去除图片不需要的部分,是目前效果最好的一个项目!完全免费开源 IOPaint 已经托管到 hugging face上,打开就可以直接免费使用,需要外网环境! 在线免费使用:【链接直达】 如果你需要…

Go C编程 第6课 无人机 --- 计算旋转角

旋转的秘密---认识角度 rt、lt命令学习 goc电子课程 一、编程步骤 第一步 第二步 第三步 第四步 二、画“四轴无人机” &#xff08;一&#xff09;、画第一根机轴 &#xff08;二&#xff09;、画第二根机轴 &#xff08;三&#xff09;、画完整的无人机 三、画“多轴无人…

v3s点RGB屏 40pin 800x480,不一样的点屏,不通过chosen。

一、背景、目的、简介。 一般来说&#xff0c;通过uboot将屏幕参数传给kernel&#xff0c;是通过修改设备树。 uboot和kernel都需要屏幕点亮。uboot侧重于显示一张图片。而kernel则多是动画。 在这里&#xff0c;我先是找到了一个裸机点屏的代码。将其编译成静态库后&#x…

【编译原理】编译原理知识点汇总·语法分析器(消除左递归、消除二义性、自顶向下语法分析、自下向上语法分析)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;编译原理_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

golang 并发--goroutine(四)

golang 语言最大的特点之一就是语法上支持并发&#xff0c;通过简单的语法很容易就能创建一个 go 程&#xff0c;这就使得 golang 天生适合写高并发的程序。这一章节我们就主要介绍 go 程&#xff0c;但是要想完全理解 go 程我们需要深入研究 GPM 模型&#xff0c;关于 GPM 模型…

Wireshark协议相关功能:过滤、启用/禁用、导出和统计查看

简述 Wireshark 是一个非常强大的网络分析工具&#xff0c;广泛用于网络故障排查、安全分析、协议分析等任务。在使用 Wireshark 进行网络抓包和协议分析时&#xff0c;掌握一些基本的操作技巧对于提高效率和准确性至关重要。本文将介绍 Wireshark 中如何进行协议相关的操作&a…

渗透Vulnhub-DC-9靶机

本篇文章旨在为网络安全渗透测试行业靶机教学。通过阅读本文&#xff0c;读者将能够对渗透Vulnhub系列DC-6靶机有定的了解 一、信息收集阶段 DC-9靶场信息: DC-9靶场介绍&#xff1a; https://www.vulnhub.com/entry/dc-9,412/ DC-9靶场下载&#xff1a; https://download.vu…

【Linux系列】Shell 命令:`echo ““ > img.sh`及其应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

云图库平台(三)——后端用户模块开发

需求分析&#xff1a;对于用户模块而言&#xff0c;通常要实现下列功能&#xff1a; 用户注册&#xff1a;用户输入账号、密码、确认密码进行注册账号用户登录&#xff1a;用户通过输入账号、密码登录注册账号获取当前登录用户信息&#xff1a;即得到当前已登录用户的信息用户…

怎么设置电脑密码?Windows和Mac设置密码的方法

为电脑设置密码是保护个人信息安全的重要措施。无论是Windows系统还是MacOS系统&#xff0c;设置密码的步骤都相对简单&#xff0c;但需要根据不同的操作系统选择不同的方法。 一、Windows系统电脑密码设置 方法一&#xff1a;通过控制面板设置账户密码 点击桌面左下角的“开…

思考: 与人交际

前晚可能是因为我和某个曾经的同学&#xff08;我认为是朋友&#xff0c;但是它真的很讨厌&#xff0c;现在觉得它在PUA很多人&#xff09;发生了一件事情&#xff0c;现在没关系了&#xff0c;算是到此结束了&#xff0c;再也不见。 让我看清楚了人和人的交际需要什么&#xf…

突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除

GitLab停止为中国大陆、香港和澳门地区提供服务&#xff0c;要求用户在60天内迁移账号&#xff0c;否则将被删除。这一事件即将引起广泛的关注和讨论。以下是对该事件的扩展信息&#xff1a; 1. 背景介绍&#xff1a;GitLab是一家全球知名的软件开发平台&#xff0c;提供代码托…

vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)

扫描出ip为192.168.121.161 访问该ip&#xff0c;发现只是一个静态页面什么也没有 使用dir dirsearch 御剑都只能扫描到/robots.txt /server-status 两个页面&#xff0c;前者提示我们什么也没有&#xff0c;后面两个没有权限访问 扫描端口&#xff0c;存在81端口 访问&#x…

美股开户网:谷歌搜索迎“大动作”:推出AI模式切换选项应对竞争压力

谷歌的AI战略新举措 近日&#xff0c;硅谷权威媒体《The Information》报道了谷歌即将在其搜索引擎中推出一项全新的功能——“切换到AI模式”。这一新功能将为用户提供更加智能、对话式的回答&#xff0c;标志着谷歌对人工智能&#xff08;AI&#xff09;领域的进一步布局&am…

如何在window 使用 conda 环境下载大模型

最近开始学习 变形金刚&#xff0c;最大的问题就是 huggingface 无法访问&#xff0c;无论是翻墙还是通过本地镜像网站HF-Mirror&#xff0c;然后再通过git下载都很慢&#xff0c;影响学习进度&#xff0c;后面看了如下文章&#xff0c;Huggingface配置镜像_huggingface镜像-CS…

WebRTC学习二:WebRTC音视频数据采集

系列文章目录 第一篇 基于SRS 的 WebRTC 环境搭建 第二篇 基于SRS 实现RTSP接入与WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 环境搭建 第四篇 WebRTC 学习一&#xff1a;获取音频和视频设备 第五篇 WebRTC学习二&#xff1a;WebRTC音视频数据采集 文章目录 系列文章…

内部知识库的未来展望:技术融合与用户体验的双重升级

在当今数字化飞速发展的时代&#xff0c;企业内部知识库作为知识管理的关键载体&#xff0c;正站在变革的十字路口&#xff0c;即将迎来技术融合与用户体验双重升级的崭新时代&#xff0c;这一系列变化将深度重塑企业知识管理的格局。 一、技术融合&#xff1a;开启知识管理新…

淘宝详情API接口怎么去使用,调用解析

淘宝开放平台提供了丰富的API接口&#xff0c;帮助开发者快速实现与淘宝的交互。其中&#xff0c;淘宝详情API是用于获取商品详情的重要接口之一。通过调用该接口&#xff0c;开发者可以获取到商品的详细信息&#xff0c;如价格、库存、描述等。本文将详细介绍如何调用淘宝详情…

框架程序设计-简答以及论述

目录 maven的pom作用&#xff1a; Pointcut("execution(*com.example.dome.*.*(……))") 缓存的作用&#xff0c;redis配置过程 Redis配置过程&#xff1a; SpringBoot缓存配置过程&#xff1a; AOP的五种增强注解&#xff1a; 论述题&#xff1a;包结构作用、…