Android 之 Activity 的启动模式(launchMode)

devtools/2024/12/29 16:50:15/

一、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.activityimport 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.Rclass 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.ppmy.cn/devtools/146083.html

相关文章

【ETCD】【实操篇(十四)】etcd 集群备份与还原指南

etcd 是一个高可用的分布式键值存储&#xff0c;常用于分布式系统的配置共享和服务注册。本文将基于提供的启动脚本&#xff0c;详细讲解如何对 etcd 集群进行数据的备份与还原。 目录 一、启动 etcd 集群二、备份 etcd 数据1. 使用 etcdctl 保存快照2. 验证快照文件 三、还原 …

SQL 表连接操作

SQL 表连接操作是数据库查询中一个非常重要的概念&#xff0c;它允许从多个表中检索相关数据。表连接的主要类型包括 INNER JOIN、LEFT JOIN(或 LEFT OUTER JOIN)、RIGHT JOIN(或 RIGHT OUTER JOIN)、FULL JOIN(或 FULL OUTER JOIN)以及 CROSS JOIN。下面是详细解释每种连接操作…

将 ASP.NET Core 应用程序的日志保存到 D 盘的文件中 (如 Serilog)

将 ASP.NET Core 应用程序的日志保存到 D 盘的文件中&#xff0c;可以使用第三方日志库&#xff08;如 Serilog&#xff09;来实现。Serilog 是一个流行的日志库&#xff0c;支持将日志输出到文件、控制台、数据库等多种目标。 以下是实现步骤&#xff1a; 1. 安装 Serilog 相…

智慧城市可以实现哪些方面的监测

智慧城市通过集成物联网、大数据、云计算、人工智能等前沿技术&#xff0c;实现了对城市运行状态的全面、实时、精准的监测。这种监测覆盖了城市的多个关键领域&#xff0c;为城市管理提供了强有力的数据支持&#xff0c;推动了城市的可持续发展和居民生活质量的提升。以下是对…

模方要使用多机引擎,有什么要求

1.多台机器需要在同一个局域网下&#xff0c;并且其他机器也安装了模方软件 2.工程放在网络路径&#xff0c;此时任务路径默认是网络路径&#xff0c;不建议修改 3.数据存在网络路径&#xff0c;包括新建工程时添加的 osgb、obj、空三文件&#xff0c;匀色需要使用多机的话也…

gcc和g++的联系和区别

1. GCC 和 G 的全称 GCC: GNU Compiler Collection 它是一个完整的编译器集合&#xff0c;支持多种编程语言&#xff08;包括 C、C、Fortran、Go、Ada 等&#xff09;。当使用 gcc 命令时&#xff0c;默认将其视为 GNU C 编译器&#xff0c;但它同样可以编译 C 程序&#xff08…

Airwallex空中云汇实现独立站安全高效收款

在数字化浪潮的强劲推动下&#xff0c;全球贸易正加快迈向数字化转型&#xff0c;其中跨境电商已深度融入国际贸易体系&#xff0c;成为促进全球经济互联互通的重要力量。 而独立站在这一领域中扮演着 举足轻重的角色&#xff0c;吸引了越来越多的商家投身于其建设之中&#xf…

deepin 安装 zookeeper

deepin 安装 zookeeper 1、升级软件 sudo apt updatesudo apt -y dist-upgrade2、安装常用软件 sudo apt -y install gcc make openssl libssl-dev libpcre3 libpcre3-dev libgd-dev \rsync openssh-server vim man zip unzip net-tools tcpdump lrzsz tar wget3、开启ssh …