Android 之 Activity 的启动模式(launchMode)

一、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版)》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件老化分析

软件老化 课程&#xff1a;软件质量分析 作业 解答 Python代码如下&#xff1a; n int(input("类别数&#xff1a;")) theta list(map(float, input("各个类别的权重&#xff1a;").split())) m list(map(int, input("各个类别的度量元数量&…

Jenkins 构建流水线

在 Linux 系统上安装 Jenkins 服务&#xff0c;以及配置自动化构建项目 前置准备环境&#xff1a;docker、docker-compose、jdk、maven 一、环境搭建 1. Jenkins 安装 &#xff08;1&#xff09;拉取镜像 # 安装镜像包&#xff0c;默认安装最新版本 docker pull jenkins/jen…

5G学习笔记之Non-Public Network

目录 0. NPN系列 1. 概述 2. SNPN 2.1 SNPN概述 2.2 SNPN架构 2.3 SNPN部署 2.3.1 完全独立 2.3.2 共享PLMN基站 2.3.3 共享PLMN基站和PLMN频谱 3. PNI-NPN 3.1 PNI-NPN概述 3.2 PNI-NPN部署 3.2.1 UPF独立 3.2.2 完全共享 0. NPN系列 1. NPN概述 2. NPN R18 3. 【SNPN系列】S…

若依plus apifox导入接口显示为空

项目已经正常启动 访问接口有些没问题&#xff0c;有些有问题 其他模块都可以正常导入 解决&#xff1a;

elementPlus消息组件多按钮案例

let customClass zsl-el-message-box efb.messageBox({title: 操作提示,showConfirmButton: false,customClass,message: efb.VNode(div, null, [efb.VNode(style, null, .${customClass} .el-message-box__message {width: 100%;}),efb.VNode(div, null, hello world),efb.VN…

计算机网络:应用层 —— 网络应用模式

文章目录 客户—服务器方式和对等方式客户/服务器方式 (C/S方式)工作流程特点 对等方式 (P2P方式)工作流程P2P 应用特点 客户—服务器方式和对等方式 网络应用程序运行在处于网络边缘的不同的端系统上&#xff0c;通过彼此间的通信来共同完成某项任务。 开发一种新的网络应用…

科技创新 数智未来|清科·沙丘投研院走进竹云

12月20日&#xff0c;清科沙丘投研院带领企投家团队走进竹云交流分享&#xff0c;聚焦技术创新、企业数字化管理、行业前沿应用案例等热点议题&#xff0c;深入探讨数字技术如何点燃企业高质量发展的澎湃动力&#xff0c;共话企业数字化、智能化发展之道。 达晨财智股权管理部…

外连接转AntiJoin的应用场景与限制条件 | OceanBase SQL 查询改写系列

在《SQL 改写系列&#xff1a;外连接转内连接的常见场景与错误》一文中&#xff0c;我们了解到谓词条件可以过滤掉连接结果中的 null 情形的&#xff0c;将外连接转化为内连接的做法是可行的&#xff0c;正如图1中路径(a)所示。此时&#xff0c;敏锐的你或许会进一步思考&#…

Java - 日志体系_Apache Commons Logging(JCL)日志接口库

文章目录 官网1. 什么是JCL&#xff1f;2. JCL的主要特点3. JCL的核心组件4. JCL的实现机制5. SimpleLog 简介6. CodeExample 1 &#xff1a; 默认日志实现 (JCL 1.3.2版本)Example 2 &#xff1a; JCL (1.2版本&#xff09; Log4J 【安全风险高&#xff0c;请勿使用】 7. 使用…

mavlink移植到单片机stm32f103c8t6,实现接收和发送数据

前言&#xff1a; 好久没更新博客了&#xff0c;这两个月真的是异常的忙&#xff0c;白天要忙着公司里的事&#xff0c;晚上还要忙着修改小论文&#xff0c;一点自己的时间都没有了&#xff0c;不过确确实实是学到了很多东西&#xff0c;对无人机的技术研究也更深了一些。不过好…

GitLab的安装与卸载

目录 GitLab安装 GitLab使用 使用前可选操作 修改web端口 修改Prometheus端口 使用方法 GitLab的卸载 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab安装 Gitlab的rpm包集成了它需要的软件&#xff0c;简化了安装步骤&#xff0c;所以直接…

子网掩码计算route命令

子网掩码 - 站长工具 1.子网掩码 子网掩码就是用来遮掩IP地址并划分网段的工具&#xff0c;根据遮掩的位数不同来划分不同的网段。 2.网关 网关(Gateway)又称网间连接器、协议转换器。默认网关在网络层上以实现网络互连&#xff0c;是最复杂的网络互连设备&#xff0c;仅用…

基本操作:iframe、alert

背景 如果你的目标元素出现在一个iframe标签下&#xff0c;则不能直接定位&#xff0c;必须先完成切换才能进行定位操作&#xff0c;如下图 整个理解为一个大的房间&#xff0c;里面是客厅&#xff0c;driver进到客厅后&#xff0c;如果想操作iframe A里的数据&#xff0c;需…

【再学javascript算法之美】前端面试频率比较高的基础算法题

基础算法题练习代码&#xff0c;看看能做出几道题 代码实现 找出字符串中出现次数最多的字符 const array "cncnansdnajsadnjasndjnasjdnjj";// 找出出现次数最多的字符 let obj {}; for (let index 0; index < array.length; index) {const element array[…

flask后端开发(8):Flask连接MySQL数据库+ORM增删改查

目录 数据库初始化数据库连接创建数据库表添加用户查询用户更新用户删除 在Flask中&#xff0c;很少会使用pymysql直接写原生SQL语句去操作数据库&#xff0c;更多的是通过SQLAichemy提供的ORM技术&#xff0c;类似于操作普通Python对象一样实现数据库的增删改查操作&#xff0…

视频会议是如何实现屏幕标注功能的?

现在主流的视频会议软件都有屏幕标注功能&#xff0c;屏幕标注功能给屏幕分享者讲解分享内容时提供了极大的方便。那我们以傲瑞视频会议&#xff08;OrayMeeting&#xff09;为例&#xff0c;来讲解屏幕标注是如何实现的。 傲瑞会议的PC端&#xff08;Windows、信创Linux、银河…

使用Streamlit部署机器学习模型

机器学习&#xff1a; 计算机能够从经验中学习&#xff0c;而无需明确编程。机器学习是目前最热门的领域之一&#xff0c;世界各地的顶级公司都在使用它来改善他们的服务和产品。但是没有使用在Jupyter Notebook中训练的机器学习模型。因此&#xff0c;我们需要部署这些模型&am…

解线性方程组

直接三角分解&#xff08;LU分解&#xff0c;Doolittle分解&#xff09; ATM分解&#xff08;追赶法&#xff0c;Crout分解&#xff0c;克劳特分解&#xff09; 平方根法&#xff08;Cholesky分解&#xff0c;乔列斯基分解&#xff09; 矩阵的范数

聊一聊 C#前台线程 如何阻塞程序退出

一&#xff1a;背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题&#xff1a;后台线程的内部是如何运转的 ? &#xff0c;犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程序无法退出的bug&#xff0c;最后发现是有一个 Backgrond…

带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)

适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式适配器模式&#xff08;Adapter Pattern&#xff09;概述talk is cheap&#xff0c; show you my code总结 适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是面向对象软件设计中的一种结构型设计…